一、何时用到JNI
JNI 全称 Java Native Interface (Java 本地接口)是 Java 与其他语言相互调用共同构建项目的机制。JNI 在 Android 项目中使用较多,了解其调用原理尤其重要。以下情况使用JNI:
注重处理速度
硬件控制
已有C/C++代码复用
二、调用步骤
在Java中调用C库函数步骤如下:
第一步:编写Java代码
Class HelloJNI {
// 本地方法申明
native void printHello();
native void printString(String str);
// 加载库
static { System.loadLibrary("hellojni"); }
public static void main(String args[]) {
HelloJNI mJNI = new HelloJNI();
// 调用本地方法(实际调用的是使用C语音编写的JNI本地函数)
mJNI.printHello();
mJNI.printString("Hello JNI World");
}
}
第二步:编译Java代码
/>: javac HelloJNI.java
第三步:生成 C 语言头文件
利用 Java 自带工具 Javah 生成 C 头文件:
/>: javah HelloJNI.java # 自动生成包含函数原型的C/C++头文件HelloJNI.h 。
生成后的文件如下:
/* 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: 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 库代码
#include "HelloJNI.h"
#include
// 添加名称为env与obj的两个参数
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 动态调用库
Linux下编译生成动态链接库
/>: gcc -shared -fpic hellojni.c -o libhellojni.so -I $JAVA_HOME/include
第六步:运行 Java 程序
/>: java HelloJNI
至此,大功告成。