classlink error java,Java中的链接错误

I get the following error:

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)

My java classes look like this:

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;

}

}

and

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);

}

}

My header file looks like that:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* 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

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, "", "(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;

}

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?

I execute it this way:

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

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 reports:

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() method could be declared static; you can use it without instantiating JNIResultSet class.

mid should point to the constructor, not getSpieler(), but the signature is wrong: it should take Ljava/lang/String;Ljava/lang/String;I and not three ints:

jmethodID mid = (*env)->GetMethodID(env, clazz, "", "(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);

Always check the method IDs and objects for NULL before proceeding to the next step.

Regarding the unsatisfied link, check that the libspieler.so file is good: run nm -D to see if JAVA_model_JNIResultSet_getSpieler is actually exported. rename JAVA_model_JNIResultSet_getSpieler to Java_model_JNIResultSet_getSpieler, exactly as indicated in the generated .h file.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值