我正在使用 Ubuntu 14.04
我是JNI的新人,所以我对JNI和英语都不熟悉。我正在使用 Ubuntu 14.04
我做了什么
爪哇
class Hello {
public native void sayHello();
static { System.loadLibrary("myapp"); }
public static void main(String[] args){
new Hello().sayHello();
}
}
编译java代码并生成头文件命令
javac Hello.java
javah Hello
C代码
#include "myapp.h"
JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *env, jobject job ){
printf("Saying hello\n");
}
编译c代码命令(我有5个静态编译库,如* .a)。
gcc -shared -fPIC -o libmyapp.so -I"path/to/include/jni" -I"path/to/include/myapp" path/to/lib/libmyapp1.a path/to/lib/libmyapp2.a path/to/lib/libmyapp3.a path/to/lib/libmyapp4.a path/to/lib/libmyapp5.a -lm -lpthread -lc -lz Hello.c
生成文件libmyapp.so
编译完成后,我用nm检查函数命名:
$ nm libmyapp.so | grep say
00000000000031a0 T _Java_Hello_sayHello
我尝试使用java -Djava.library.path=src/ Hello
运行时遇到错误我有这个错误:
java: symbol lookup error: /path/to/myapplication.so : undefined symbol: myfunc_init
所以在我看来,显然,在编译c共享库时出现了问题。
为什么每次我想调用myfunc_init时都会出现符号查找错误,原因是什么?请提供编译共享库的解决方案和正确方法。并且可以在Java 7下面加载静态库。如果不可能,我怎样才能从静态库中构建动态库。
我希望你能提供这些信息。