JNI注册,是指将java层方法(native关键字修饰的)和C层方法对应起来,以实现java层代码调用c层代码的目的。JNI注册分为静态注册和动态注册两种,静态注册是通过固定格式方法名进行关联,动态注册是通过动态添加映射关系来进行关联,方法名可以随便起,比较灵活,我们推荐使用动态注册。在进行注册前,需要先下载两个工具Clion和eclipse(能写java application就可以),然后我们就可以开始注册了。
package clz;
public class Register {
native String helloworld();
}
#include "jni.h"
//clz_Register.c
#include "clz_Register.h"
JNIEXPORT jstring JNICALL Java_clz_Register_helloworld
(JNIEnv * env, jobject jobject){
return (*env)->NewStringUTF(env,"helloworld");
}
add_library(firstlib SHARED clz_Register.h clz_Register.c)
package clz;
public class Register {
static {
System.load("/Users/djx/eclipse-workspace/JavaJni/libs/libfirstlib.dylib");
}
native String helloworld();
public static void main(String[] args) {
Register re = new Register();
System.out.println(re.helloworld());
}
}
package register;
public class DynamicRegister {
native void dynamicFunc1();
native String dynamicFunc2();
}
#include "jni.h"
void func1(JNIEnv *env,jobject jobject){
printf("dynamicNative1 动态注册\n");
}
jstring func2(JNIEnv *env,jobject jobject){
return (*env)->NewStringUTF(env,"hello everybody 2");
}
static const char * mClassName = "register/DynamicRegister";
// 三个参数,java层函数名,java层方法签名,c层方法指针
// 获取签名方法:javap -s -p DynamicRegister.class
static const JNINativeMethod mMethods[]={
{"dynamicFunc1","()V",(void*)func1},
{"dynamicFunc2","()Ljava/lang/String;",(void*)func2},
};
//java层load时,便会自动调用该方法
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved){
printf("hello dynamic0\n");
JNIEnv* env = NULL;
//获得 JniEnv
int r = (*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_8);
if( r != JNI_OK){
return -1;
}
//FindClass,反射,通过类的名字反射出一个
jclass mainActivityCls = (*env)->FindClass( env,mClassName); // 注册 如果小于0则注册失败
r = (*env)->RegisterNatives(env,mainActivityCls,mMethods,2);
if(r != JNI_OK )
{
return -1;
}
printf("hello dynamic\n");
return JNI_VERSION_1_8;
}
add_library(firstdylib SHARED DynamicRegister.c)
package register;
public class DynamicRegister {
native void dynamicFunc1();
native String dynamicFunc2();
static {
System.load("/Users/djx/eclipse-workspace/JavaJni/libs/libfirstdylib.dylib");
}
public static void main(String[] args) {
DynamicRegister dr = new DynamicRegister();
dr.dynamicFunc1();
String result=dr.dynamicFunc2();
System.out.println("dynamicFunc2:"+result+"\n");
}
}
github地址请点击
java类型 | jni类型 | 描述 |
---|---|---|
boolean | jboolean | unsighed 8 bits |
byte | jbyte | sighed 8 bits |
char | jchar | unsighed 16 bits |
short | jshort | sighed 16 bits |
int | jint | sighed 32 bits |
long | jlong | sighed 64 bits |
float | jfloat | sighed 32 bits |
double | jdouble | sighed 64 bits |
Class | jclass | class类对象 |
String | jstring | 字符串对象 |
Object | jobject | 任何java对象 |
byte[] | jbyteArray | byte数组 |