第一步
新建一个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 <jni.h>
/* 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 <stdio.h>
#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
<font color=red>注意$JAVA_HOME要替换成jdk根目录。生成的动态库名务必以lib开头</font>
第五步
查询出java.library.path这个属性指向的路径,把编译出来的动态库复制到这些路径中的某一个,并用sudo chmod 777 libhellojni.so加上所以权限。
第六步
用javac命令编译第一步的java文件,然后用java HelloJni 运行,得到结果:
HelloJni! This is my first jni call.
网友评论