介绍
JNI (Java Native Interface) :Java和C/C++互调的api
JNI数据类型
Java类型->JNI类型->C类型
Java数据类型与JNI数据类型的映射关系
- 基础数据类型
boolean jboolean (Java类型前面加个j就是JNI数据类型) - 引用数据类型
String jstring
Object jobject - 数组
byte[] jByteArray
object[](String[]) jobjectArray
开发流程
写java代码 native方法
package me.happy.study; public class JNITest { public native static String getStringFromC(); public static void main(String[] args) { System.out.println(getStringFromC()); } //加载动态库 static{ System.loadLibrary("jni_study"); } }
项目src目录下执行javah命令+完整类名 生成.h头文件(me_happy_study_JNITest.h)
/* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class me_happy_study_JNITest */ #ifndef _Included_me_happy_study_JNITest #define _Included_me_happy_study_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: me_happy_study_JNITest * Method: getStringFromC * Signature: ()V */ JNIEXPORT jstring JNICALL Java_me_happy_study_JNITest_getStringFromC (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
写C/C++代码实现.h里的函数
#include "me_happy_study_JNITest.h" //C函数实现 //C函数名:Java_完整类名_函数名 JNIEXPORT jstring JNICALL Java_me_happy_study_JNITest_getStringFromC(JNIEnv *env, jclass jcls){ //JNIEnv:结构体指针 env二级指针 //JNIEnv代表java运行环境,调用java中的代码 //jclass:该函数所属java类的class对象(JNITest.class) //将C字符串转为Java字符串 (*env)->NewStringUTF(env,"C String"); } #include "me_happy_study_JNITest.h" //C++函数实现 //C++函数名:Java_完整类名_函数名 JNIEXPORT jstring JNICALL Java_me_happy_study_JNITest_getStringFromC(JNIEnv *env, jclass jcls){ //JNIEnv 结构体别名 env一级指针 /* C++对C的封装 传入this指针 而正因如此C中env是二级指针 jstring NewStringUTF(const char *utf) { return functions->NewStringUTF(this,utf); } */ env->NewStringUTF("C String"); }