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我在 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