JNI的静态注册与动态注册

357 阅读1分钟

1.JNI的静态注册

第一步:创建一个java.class  如Register.class,编写一个native方法  public native void helloWord();

第二步:在当前class目录下打开cmd,用命令行下输入 javac Register.java 生成Register.class文件

第三步:在 Register.class 目录下 回退cd ..至src目录下 通过 javah test.Register(全类名)生成 test_Register.h 头文件

第四步:新建C++库
并拷贝test_Register.h 下的函数,在CMakeLists.txt文件配置add_library(firstLib SHARED test_Register.h),再在该文件下新建同名的编写test_Register.c 源文件,

第五步:找到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+库

第四步测试