我试图将JNI用于现有的C库。当我尝试使用此命令生成.so文件时:
gcc -shared -fpic -o libWrapper.so -I/usr/lib/jvm/java-1.7.0-openjdk-i386/include/ -I/usr/lib/jvm/java-1.7.0-openjdk-i386/include/linux/ -I/home/testdpdk/packet-pro/dpdk-2.0.0/i686-native-linuxapp-gcc/include Wrapper.c -Wl,-z,defs
我得到的错误与JNI中包含的方法的未定义引用有关:
/tmp/ccyrfz1B.o: In function `Java_Wrapper_eal_1init':
Wrapper.c:(.text+0x62): undefined reference to `GetObjectArrayElement'
Wrapper.c:(.text+0x7f): undefined reference to `GetStringUTFChars'
Wrapper.c:(.text+0xce): undefined reference to `env_init'
如何让JNI方法引用工作?另外,我如何将现有的C库链接到此共享对象文件中,以便' env_init'方法(libWrapper.so)?
答案 0 :(得分:1)
您似乎正在呼叫GetObjectArrayElement
和朋友作为功能。它们不是函数:它们是env
中的函数指针。将它们称为
(*env)->GetObjectArrayElement(env, ...)