JNI入门

第一步

新建一个java文件HelloJni.java,内容如下:

public class HelloJni{

static{
    System.loadLibrary("hellojni"); 
}
public static void main(String[] args){
    HelloJni helloJni = new HelloJni();
    helloJni.sayHello();
}

native void sayHello();
}

第二步

用命令javah HelloJni生成一个头文件,内容一般如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class HelloJni */

#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     HelloJni
* Method:    sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_sayHello
    (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

第三步

实现这个jni调用的本地方法,新建HelloJni.c,内容如下:

#include 
#include "HelloJni.h"

/*该方法在HelloJni.h中声明
 JNIEXPORT和JNICALL都是JNI中的关键字
    JNIEnv对应java线程中调用的JNI环境,通过这个参数可以调用  一些JNI函数
jobject对应当前java线程中调用本地方法的对象
*/
JNIEXPORT void JNICALL Java_HelloJni_sayHello
(JNIEnv * env, jobject obj)
{
    printf("HelloJni! This is my first jni call.");
}

第四步

把c文件和头文件编译成c动态库,命令如下:

#mac os x 
gcc -shared HelloJni.c -I/SystemLibraryFrameworks/JavaVM.framework/Headers -o libhellojni.dylib 
#linux
gcc -fPIC -D_REENTRANT -I/$JAVA_HOME/include -I/$JAVA_HOME/include/linux -shared -o libhellojni.so  HelloJni.c

注意$JAVA_HOME要替换成jdk根目录。生成的动态库名务必以lib开头

第五步

查询出java.library.path这个属性指向的路径,把编译出来的动态库复制到这些路径中的某一个,并用sudo chmod 777 libhellojni.so加上所以权限。

第六步

用javac命令编译第一步的java文件,然后用java HelloJni 运行,得到结果:

HelloJni! This is my first jni call.
  • 参考资料:
    • JNI初步 -- Hello JNI示例
    • JNI HELLOWORLD

你可能感兴趣的:(JNI入门)