前言

接上文《JNI动态注册》,介绍了简单的动态注册,这篇是整理一下动态注册的主要修改点。

PS : 个人流水账,不一定适合所有人,可以跳过,谢谢

正文

依旧注册Hello.java类

  1. package com.biumall.dynamic.one;
  2. public class Hello {
  3.   // 1. load Hello.so
  4.   static {
  5.       System.loadLibrary("Hello");
  6.   }
  7.   // 2. define native sayHello()
  8.   public static native void fromJavaHello(String message);
  9.   public static native String fromJniHello();
  10. }
复制

跟之前不一的是多了一个方法,新增了从java传入一个String给JNI。

通过之前签名获取方式一,可以得到

  1. public static native void fromJavaHello(java.lang.String);
  2.   Signature: (Ljava/lang/String;)V
  3.    
  4. public static native java.lang.String fromJniHello();
  5.   Signature: ()Ljava/lang/String;
复制

之前说过JNI动态注册的优点

  1. 灵活性高, 更改类名,包名或方法名时, 只需对更改模块进行少量修改, 效率高
复制

我们新增了一个方法或改了方法名,也就是只需要修改对应类名,包名和方法名即可。

在上一个动态注册代码基础上修改

修改包名类名

  1. //定义Hello.java类路径[包名+类名,只不过.换成了/]
  2. //com.biumall.dynamic.one.Hello
  3. #define DYNAMIC_CLASS "com/biumall/dynamic/one/Hello"
复制

由于在之前基础上改,包名和类名都没变。

这里我们可以保持一致

修改方法名

由于方法名变或新增了了

  1. public static native void fromJavaHello(String message);
  2. public static native String fromJniHello();
复制

因此我们需要创建对应的native方法(命名不一定要跟我一样,native_+java方法名,只是方便阅读,看个人风格)

  1. JNIEXPORT void JNICALL native_fromJavaHello(JNIEnv *env, jclass jc, jstring js){
  2.   //Java String转char *str
  3.   const char *str = (*env)->GetStringUTFChars(env, js, 0);
  4.   LOGE("native_fromJavaHello : %s ", str);
  5.   (*env)->ReleaseStringUTFChars(env, js, str);
  6. }
  7. JNIEXPORT jstring JNICALL native_fromJniHello(JNIEnv *env, jclass jc){
  8.   return (*env)->NewStringUTF(env, "Hello from JNI!");
  9. }
复制

新增了方法,因此需要让java和c方法对应起来。也就需要修改method_table即可。

  1. //定义Java和JNI函数的绑定表
  2. // 方法数组,分别为:(方法名[java层定义的],方法签名,函数指针[c层对应替换的方法])
  3. // 可以通过javac和javap 获取 方法签名
  4. JNINativeMethod method_table[]= {
  5.       {"fromJavaHello", "(Ljava/lang/String;)V", (void*) native_fromJavaHello},
  6.       {"fromJniHello", "()Ljava/lang/String;", (void*) native_fromJniHello},
  7. };
复制

其他的不用变。

然后ndk-build和运行起来了。

相对于静态注册,动态注册是非常方便的。只需要修改的包名,类名和方法即可!

参考文章

  1. JNI动态注册

相关文章

暂无评论

none
暂无评论...