Java jni未定义符号错误
我正在尝试JNI示例代码。Java jni未定义符号错误,java,gcc,java-native-interface,undefined-symbol,Java,Gcc,Java Native Interface,Undefined Symbol,我正在尝试JNI示例代码。 (您可以通过github获得以下所有源代码:) Sample.java 公共类样本 { 公共本机int方法(int n); 公共本机布尔布尔方法(布尔布尔); 公共本机字符串stringMethod(字符串文本); 公共本地int intArray方法(int[]intArray); 公共静态void main(字符串[]args) { 系统加载库(“样本”); 样本=新样本(); int平方=样本。int方法(5); 布尔布尔=sample.booleanMet
(您可以通过github获得以下所有源代码:)
- Sample.java
- 样本c
- 样本h
如何修复此问题?在包含
stdio.h
和/或string.h
后,是否尝试编译C文件?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例程。Java似乎在使用其他库的JNI库时遇到问题。 我现在也有同样的问题,我想用glib创建一个JNI库。Java不想知道glib函数,尽管所有的编译和链接都很好 因此,如果您编写JNI LIB,就不能使用该代码中的任何其他LIB
编辑:将任何库静态链接到您的JNI库中。这应该会起作用!对不起,我只是更正了我的问题。“”被自动识别为一个标记,并且不可见。我唯一的想法是让您尝试在一行中编译它,如
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)你的问题是StruUPR不是你的C/C++库的一部分,这是有意义的,因为它不是标准的ANSI C。解决方案是编写你自己的例程。好,如果这个问题是因为一个非标准函数,为什么这个JNI运行得很好?我认为JNI只提供接口,所以如果我可以在NATE-VER C或C++上运行一些代码,它必须B。用jni是可能的,不是吗?
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: symbol lookup error: /home/ph/tmp/jni/libsample.so: undefined symbol: strupr
$ 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