第一步:编写 java 代码
class HelloJNI{
//本地方法声明
native void printHello();
native void printString(String str);
//加载库
static{System.loadLibrary("hellojni");}
public static void main(String args[]){
HelloJNI myJNI = new HelloJNI();
//调用本地方法
myJNI.printHello();
myJNI.printString("Hello world from printString fun");
}
}
第二步:编译 java 代码
javac HelloJNI.java
第三步:生成 C 头文件
javah HelloJNI
生成 HelloJNI.h 头文件:
/* 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: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printHello
(JNIEnv *, jobject);
/*
* Class: HelloJNI
* Method: printString
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_HelloJNI_printString
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
第四步:编写 C/C++ 代码
#include "HelloJNI.h"
#include "stdio.h"
JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv * env, jobject obj){
printf("Hello world!\n");
return;
}
JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv * env, jobject obj, jstring string){
//将 java String 转换成 C 字符串
const char *str = (*env)->GetStringUTFChars(env,string,0);
printf("%s!\n",str);
return;
}
第五步:生成 C 共享库(Ubuntu下)
gcc -shared -fPIC -I /usr/lib/jvm/java-7-openjdk-amd64/include hellojni.c -o libhellojni.so
注:-I 参数指定 jni.h 的路径
第六步:运行 java 程序
java -Djava.library.path=. HelloJNI
注:需要将当前路径添加到 java.library.path 使其找到生成的共享库
参考资料:
1.《Android框架揭秘》
2. https://blog.csdn.net/fengqiaoyebo2008/article/details/6210499