HelloWord之JNI实例
闲来无事,所以自己练习了一遍jni实现,开始的时候程序一直找不到对应的lib库,好生苦恼,后来发现是jni生成的lib库没有添加到对应的lib库环境中,导致查找不到。。。。。
HelloWord.java
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
#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 ;
#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类似,是在程序运行时动态连接。多个进程可以连接同一个共享库。
首先,编译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了。

浙公网安备 33010602011771号