Java 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

我正在尝试JNI示例代码。
(您可以通过github获得以下所有源代码:)

  • Sample.java
公共类样本 { 公共本机int方法(int n); 公共本机布尔布尔方法(布尔布尔); 公共本机字符串stringMethod(字符串文本); 公共本地int intArray方法(int[]intArray); 公共静态void main(字符串[]args) { 系统加载库(“样本”); 样本=新样本(); int平方=样本。int方法(5); 布尔布尔=sample.booleanMethod(true); String text=sample.stringMethod(“JAVA”); int sum=sample.intArrayMethod(新的int[]{1,1,2,3,5,8,13}); System.out.println(“intMethod:+square”); System.out.println(“布尔方法:+bool”); System.out.println(“stringMethod:+text”); System.out.println(“intArrayMethod:+sum”); } }
  • 样本c
#包括“sample.h” #包括 #ifdef_uucplusplus 外部“C”{ #恩迪夫 JNIEXPORT jint JNICALL Java\u示例\u intMethod (JNIEnv*env,jobject对象,jint num){ 返回num*num; } JNIEXPORT jboolean JNICALL Java_示例_布尔方法 (JNIEnv*env、jobject对象、jboolean布尔值){ 返回!布尔值; } JNIEXPORT jstring JNICALL Java_示例_stringMethod (JNIEnv*env,jobject对象,jstring字符串){ const char*str=(*env)->GetStringUTFChars(env,string,0); char-cap[128]; strcpy(cap,str); (*env)->释放字符串utfchars(env,string,str); return(*env)->NewStringUTF(env,strupr(cap)); } JNIEXPORT jint JNICALL Java\u Sample\u intArrayMethod (JNIEnv*env、jobject obj、jintArray阵列){ int i,和=0; jsize len=(*env)->GetArrayLength(env,数组); jint*body=(*env)->GetIntArrayElements(env,数组,0); 对于(i=0;iReleaseIntarrayements,环境,数组,主体,0); 回报金额; } void main(){} #ifdef_uucplusplus } #恩迪夫
  • 样本h
/*不要编辑此文件-它是机器生成的*/ #包括 /*类示例的标题*/ #ifndef(包括样本) #定义包含的样本 #ifdef_uucplusplus 外部“C”{ #恩迪夫 /* *类别:样本 *方法:intMethod *签字:(一)一 */ JNIEXPORT jint JNICALL Java\u示例\u intMethod (JNIEnv*,jobject,jint); /* *类别:样本 *方法:布尔方法 *签名:(Z)Z */ JNIEXPORT jboolean JNICALL Java_示例_布尔方法 (JNIEnv*,jobject,jboolean); /* *类别:样本 *方法:stringMethod *签名:(Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_示例_stringMethod (JNIEnv*,jobject,jstring); /* *类别:样本 *方法:非排列法 *签字:([I)I */ JNIEXPORT jint JNICALL Java\u Sample\u intArrayMethod (金塔里jobject JNIEnv*); #ifdef_uucplusplus } #恩迪夫 #恩迪夫 我在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 提示符$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/ 提示$gcc-shared-o libsample.so sample.o 但当我运行“java示例”时,会出现一个错误

java: symbol lookup error: /home/ph/tmp/jni/libsample.so: undefined symbol: strupr java:符号查找错误:/home/ph/tmp/jni/libsample.so:未定义的符号:strupr
如何修复此问题?

在包含
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