1.JNI的静态注册
第一步:创建一个java.class 如Register.class,编写一个native方法 public native void helloWord();
第二步:在当前class目录下打开cmd,用命令行下输入 javac Register.java 生成Register.class文件
第五步:找到jdk1.8目录 复制 jni.h 和jni_md.h文件在当前项目里
第六步:在CMakeLists.txt文件更新配置add_library(firstLib SHARED test_Register.h test_Register.c),编译生成动态/静态链接库
备注:#include <jni.h> <>代表添加系统头文件 #include "" ""代表自己的头文件
jdk1.8可以同时生成.c和.h 输入命令行 javac -h . Register.java
调用: System.load("E:\Eworkspace\...\fistLib.dll"); System.loadLibrary("native-lib");
2.JNI的动态注册
第一步: //Java代码如下:
native void dynamicNative();
native String dynamicNative(int i);
静态注册
public native String HelloWorld();-》
JNIEXPORT jstring JNICALL Java_clz_Register_HelloWorld
(JNIEnv * env, jobject jobject)
不需要对于:动态的调节过程,适配?
native void dynamicFunc1();
native String dynamicFun2();
void func1(JNIEnv *env, jobject jobject) {
printf("dynamicNative1 动态注册");
}
jstring func2(JNIEnv *env, jobject jobject) {
return (*env)->NewStringUTF(env," hello everybody 2");
}
第二步:新建一个.c文件 模板代码
#include "jni.h"
void func1(JNIEnv *env, jobject jobject) {
printf("dynamicNative1 动态注册");
}
jstring func2(JNIEnv *env, jobject jobject) {
return (*env)->NewStringUTF(env," hello everybody 2");
}
jint getRandom(JNIEnv *env, jobject jobject) {
printf("retrun ");
return 100;
}
static const char * mClassName = "test/DynamicRegister";
static const JNINativeMethod mMethods[] = {
{"dynamicFunc1", "()V", (void*)func1},
{"dynamicFun2", "()Ljava/lang/String;", (void*)func2},
{"getRandom", "()I",(void*)getRandom},
};
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
printf("hello dynamic0");
JNIEnv* env = NULL;
//获得 JniEnv
int r = (*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4);
if( r != JNI_OK){
return -1;
}
jclass mainActivityCls = (*env)->FindClass(env, mClassName);
// 注册 如果小于0则注册失败
r = (*env)->RegisterNatives(env,mainActivityCls,mMethods,3);
if(r != JNI_OK )
{
return -1;
}
printf("hello dynamic");
return JNI_VERSION_1_4;
}
第三步:CmakeList 添加 add_library(dyLib SHARED DynamicRegister.c) rebuild project 生成c+库
第四步测试