jni 未定义符号错误

Posted

技术标签:

【中文标题】jni 未定义符号错误【英文标题】:jni undefined symbol error 【发布时间】:2013-10-22 19:25:31 【问题描述】:

我正在尝试 JNI 示例代码。 (您可以通过github获取以下所有资源:https://github.com/pilhoon/jni-test)

Sample.java 公共课示例 公共本机 int intMethod(int n); public native boolean booleanMethod(boolean bool); public native String stringMethod(String text); 公共本机 int intArrayMethod(int[] intArray); 公共静态无效主要(字符串 [] 参数) System.loadLibrary("样本"); 样品样品 = 新样品(); int square = sample.intMethod(5); boolean bool = sample.booleanMethod(true); 字符串文本 = sample.stringMethod("JAVA"); int sum = sample.intArrayMethod(new int[]1,1,2,3,5,8,13 ); System.out.println("intMethod:" + square); System.out.println("booleanMethod:" + bool); System.out.println("stringMethod:" + text); System.out.println("intArrayMethod:" + sum); sample.c #include "sample.h" #include #ifdef __cplusplus 外部“C” #万一 JNIEXPORT jint JNICALL Java_Sample_intMethod (JNIEnv *env, jobject obj, jint num) 返回数 * 数; JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod (JNIEnv *env, jobject obj, jboolean boolean) 返回!布尔值; JNIEXPORT jstring JNICALL Java_Sample_stringMethod (JNIEnv *env, jobject obj, jstring 字符串) const char *str = (*env)->GetStringUTFChars(env, string, 0); 字符帽[128]; strcpy(cap, str); (*env)->ReleaseStringUTFChars(env, string, str); 返回 (*env)->NewStringUTF(env, strupr(cap)); JNIEXPORT jint JNICALL Java_Sample_intArrayMethod (JNIEnv *env, jobject obj, jintArray 数组) 整数 i, 总和 = 0; jsize len = (*env)->GetArrayLength(env, array); jint *body = (*env)->GetIntArrayElements(env, array, 0); for (i=0; iReleaseIntArrayElements(env, array, body, 0); 返回总和; 无效的主要() #ifdef __cplusplus #万一 sample.h /* 不要编辑这个文件 - 它是机器生成的 */ #include /* 类示例的标题 */ #ifndef _Included_Sample #define _Included_Sample #ifdef __cplusplus 外部“C” #万一 /* * 类别:样本 * 方法:intMethod * 签名:(I)I */ JNIEXPORT jint JNICALL Java_Sample_intMethod (JNIEnv *, jobject, jint); /* * 类别:样本 * 方法:布尔方法 * 签名:(Z)Z */ JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod (JNIEnv *, jobject, jboolean); /* * 类别:样本 * 方法:字符串方法 * 签名:(Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_Sample_stringMethod (JNIEnv *, jobject, jstring); /* * 类别:样本 * 方法:intArrayMethod * 签名:([I)I */ JNIEXPORT jint JNICALL Java_Sample_intArrayMethod (JNIEnv *, jobject, jintArray); #ifdef __cplusplus #万一 #万一

我在 CentOS 6.3 上用 gcc 编译了这些

prompt$ gcc -c -o sample.o -fPIC sample.c -I /usr/java/jdk1.7.0_07/include/ -I /usr/java/jdk1.7.0_07/include/linux/ prompt$ gcc -shared -o libsample.so sample.o

但是当我运行“java Sample”时,出现错误。

java:符号查找错误:/home/ph/tmp/jni/libsample.so:未定义符号:strupr

我该如何解决这个问题?

【问题讨论】:

好的,如果这个问题是因为一个非标准的函数,为什么没有jni可以运行良好?我认为 jni 只提供接口,所以如果我可以在 native-C 或 C++ 上运行一些代码,那么 jni 必须是可能的。不是吗? 【参考方案1】:

您是否尝试在包含stdio.h 和/或string.h 后编译C 文件?

【讨论】:

抱歉,我只是更正了我的问题。 '' 被自动识别为标签且不可见。 我唯一的另一个想法是让你尝试在一行中编译它,例如 gcc -fPIC $CPPFLAGS -o libsample.so -shared sample.c 其中$CPPFLAGS 是你的包含。 @plhn 您是否确认 libc 已与共享库链接? ldd ./libsample.so @Samhain $ ldd libsample.so \n linux-gate.so.1 => (0x003dd000) \n libc.so.6 => /lib/libc.so.6 (0x00d70000) \ n /lib/ld-linux.so.2 (0x00d0e000) @plhn k。您的问题是 strupr 不是您的基本 C/C++ 库的一部分,这是有道理的,因为它不是标准的 ANSI C。解决方案是编写自己的例程。【参考方案2】:

strupr 不是标准的 ANSI C。如果您编写一个引用 strupr 的本机 C 应用程序,您将收到类似于您所看到的链接错误

$ gcc  -o sample -fPIC Sample.c -I /xxx/include/ -I  /xxx/include/linux/
Sample.c: In function âJava_Sample_stringMethodâ:
Sample.c:23: warning: passing argument 2 of â(*env)->NewStringUTFâ makes pointer from             integer without a cast
Sample.c: In function âmainâ:
Sample.c:40: warning: passing argument 1 of âprintfâ makes pointer from integer without a cast
/tmp/cc6hPBKz.o: In function `Java_Sample_stringMethod':
Sample.c:(.text+0xaa): undefined reference to `strupr'
/tmp/cc6hPBKz.o: In function `main':
Sample.c:(.text+0x103): undefined reference to `strupr'
collect2: ld returned 1 exit status

解决方案是编写自己的 strupr 例程。

【讨论】:

【参考方案3】:

Java 似乎在使用其他库的 JNI 库方面存在问题。 我现在有同样的问题,我想使用 glib 制作一个 JNI 库。 Java 不想知道 glib 函数,尽管一切编译和链接都很好。

因此,如果您编写 JNI 库,则不能使用该代码中的任何其他库!

编辑:将任何库静态链接到您的 JNI 库中。应该可以!

【讨论】:

以上是关于jni 未定义符号错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 jni 和 OpenCV 创建的带有 lib 的未定义符号

架构 x86_64 的未定义符号:JNI_CreateJavaVM OS-X Xcode

jni报错日志打印方法未定义

对 `JNI_CreateJavaVM' linux 的未定义引用

“未定义符号”,但函数已定义和声明,没有拼写错误

什么是未定义的引用/未解决的外部符号错误,我该如何解决?