Java中的链接错误 [英] Link Error in Java
问题描述
我收到以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: model.JNIResultSet.getSpieler()[Lmodel/Spieler;
at model.JNIResultSet.getSpieler(Native Method)
at model.JNIResultSet.main(JNIResultSet.java:18)
我的java类如下:
package model;
public class Spieler {
private String vorname;
private String nachname;
private int trikotnummer;
public Spieler(String vorname, String nachname, int trikotnummer) {
this.vorname = vorname;
this.nachname = nachname;
this.trikotnummer = trikotnummer;
}
}
和
package model;
public class JNIResultSet {
public JNIResultSet() { }
public native Spieler[] getSpieler();
static {
System.loadLibrary("spieler");
}
public static void main(String[] args) {
JNIResultSet jni = new JNIResultSet();
Spieler s[] = jni.getSpieler();
System.out.println("Laenge: " + s.length);
}
}
我的头文件如下所示:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class model_JNIResultSet */
#ifndef _Included_model_JNIResultSet
#define _Included_model_JNIResultSet
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: model_JNIResultSet
* Method: getSpieler
* Signature: ()[Lmodel/Spieler;
*/
JNIEXPORT jobjectArray JNICALL Java_model_JNIResultSet_getSpieler
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
最后我的C代码看起来像这样:
And finally my C code looks like that:
JNIEXPORT jobjectArray JNICALL
JAVA_model_JNIResultSet_getSpieler(JNIEnv *env, jobject obj) {
Spieler *ptr = head;
jobjectArray ret;
int i;
jclass clazz = (*env)->FindClass(env, "model/Spieler");
jmethodID mid = (*env)->GetMethodID(env, clazz, "<init>", "(III)V");
jobject object;
ret= (*env)->NewObjectArray(env, count,
clazz,
NULL);
for(i = 0; i < count; i++) {
object = (*env)->NewObject(env, clazz, mid, ptr);
(*env)->SetObjectArrayElement(env,
ret, i, object);
ptr = ptr->next;
}
return ret;
}
您对解决该问题有任何建议吗?
我也不知道C代码是否正确,也许就是问题所在?
Do you have any suggestions how to fix that problem?
I also don't know if the C code is right, maybe that's the problem?
我以这种方式执行它:
cd src
javac model/JNIResultSet.java
cd ..
cd bin
javah -jni model.JNIResultSet
gcc -fPIC -o libspieler.so -shared -I/usr/java/jdk1.8.0_73/include/ SharedTable.c -lc
java -Djava.library.path=/home/pupil/workspace/JNITableV2/bin/ model.JNIResultSet
这可能是我更新了C代码的错误,但我认为这是错误的:
Probably this is the error I've updated the C code but I think it's wrong:
jclass clazz = (*env)->FindClass(env, "model/JNIResultSet");
jmethodID mid = (*env)->GetMethodID(env, clazz, "getSpieler", "()Lmodel/Spieler;");
nm -D
报告:
U atoi
0000000000202088 B bss_start
00000000002020b0 B当前
w __cxa_finalize
0000000000202088 D _edata
00000000002022b8 B _end
U fclose
0000000000000ef0 T _fini
U fopen
w __gmon_start
00000000002020a8 B头
0000000000000948 T _init
0000000000000b35 T insertFirst
U _IO_getc
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000000ca2 T JAVA_model_JNIResultSet_getSpieler
w _Jv_RegisterClasses
U malloc
U memcpy
U memset
0000000000000c49 T反向
U strcpy
00000000002020c0 B字符串
吓死了
U atoi
0000000000202088 B bss_start
00000000002020b0 B current
w __cxa_finalize
0000000000202088 D _edata
00000000002022b8 B _end
U fclose
0000000000000ef0 T _fini
U fopen
w __gmon_start
00000000002020a8 B head
0000000000000948 T _init
0000000000000b35 T insertFirst
U _IO_getc
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000000ca2 T JAVA_model_JNIResultSet_getSpieler
w _Jv_RegisterClasses
U malloc
U memcpy
U memset
0000000000000c49 T reverse
U strcpy
00000000002020c0 B string
U strlen
推荐答案
getSpieler()
方法可以声明为静态;您可以使用它而无需实例化 JNIResultSet 类.
getSpieler()
method could be declared static; you can use it without instantiating JNIResultSet class.
mid 应该指向构造函数,而不是getSpieler()
,但是<init>
签名是错误的:应该使用Ljava/lang/String;Ljava/lang/String;I
而不是三个int
:
mid should point to the constructor, not getSpieler()
, but the <init>
signature is wrong: it should take Ljava/lang/String;Ljava/lang/String;I
and not three int
s:
jmethodID mid = (*env)->GetMethodID(env, clazz, "<init>", "(Ljava/lang/String;Ljava/lang/String;I)V");
…
jobject strVorname = (*env)->NewStringUTF(env, ptr->vorname);
jobject strNachname = (*env)->NewStringUTF(env, ptr->nachname);
object = (*env)->NewObject(env, clazz, mid, strVorname, strNachname, ptr->trikotnummer);
在继续下一步之前,请始终检查方法ID和对象是否为NULL.
Always check the method IDs and objects for NULL before proceeding to the next step.
对于不满意的链接,检查 libspieler.so 文件是否正确:运行重命名nm -D
以查看是否确实导出了JAVA_model_JNIResultSet_getSpieler
.JAVA_model_JNIResultSet_getSpieler
到Java_model_JNIResultSet_getSpieler
,完全与生成的.h
文件中指示的一样.
Regarding the unsatisfied link, check that the libspieler.so file is good: run rename nm -D
to see if JAVA_model_JNIResultSet_getSpieler
is actually exported.JAVA_model_JNIResultSet_getSpieler
to Java_model_JNIResultSet_getSpieler
, exactly as indicated in the generated .h
file.
这篇关于Java中的链接错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!