如何使用静态文件(.a)为Linux上的JNI应用程序编译动态库?

时间:2016-08-08 13:10:31

标签: java c java-native-interface shared-libraries

我正在使用 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下面加载静态库。如果不可能,我怎样才能从静态库中构建动态库。

我希望你能提供这些信息。

0 个答案:

没有答案