闲来无事,所以自己练习了一遍jni实现,开始的时候程序一直找不到对应的lib库,好生苦恼,后来发现是jni生成的lib库没有添加到对应的lib库环境中,导致查找不到。。。。。 HelloWord.java
class HelloWorld {
public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } }
javac HelloWorld.java //生成HelloWorld.class
javah -jni HelloWorld //利用生成的class文件编译成jni头文件HelloWorld.h
大致内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include </usr/lib/jvm/java-7-openjdk-amd64/include/jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv * env, jobject obj);
#ifdef __cplusplus
}
#endif
#endif
编写实现该头文件的c文件:HelloWorldImpl.c
#include "/usr/lib/jvm/java-7-openjdk-amd64/include/jni.h"
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv * env, jobject obj){ printf("Hello World!\n"); return ;
}
然后将c文件编译打包成so:
Linux中共享库以so为后缀(shared object),与Windows下的DLL类似,是在程序运行时动态连接。多个进程可以连接同一个共享库。
以下以编译mylib.c为例讲如何编译.so文件。
首先,编译HelloWorldImpl.c:
$gcc -c -fPIC -o HelloWorldImpl.o HelloWorldImpl.c -c表示只编译(compile),而不连接。-o选项用于说明输出(output)文件名。gcc将生成一个目标(object)文件HelloWorldImpl.o。 注意-fPIC选项。PIC指Position Independent Code。共享库要求有此选项,以便实现动态连接(dynamic linking)。 生成共享库:
$gcc -shared -o hello.so HelloWorldImpl.o
库文件以lib开始。共享库文件以.so为后缀。-shared表示生成一个共享库。
这样,共享库就完成了。.so文件和.h文件都位于当前工作路径(.)。
运行java HelloWorld,就可以看到我们打印的Hello world了。
转载请注明原文地址: https://ju.6miu.com/read-4810.html