前言
接上文《》,介绍了简单的动态注册,这篇是整理一下动态注册的主要修改点。
PS : 个人流水账,不一定适合所有人,可以跳过,谢谢
正文
依旧注册Hello.java类
package com.biumall.dynamic.one; public class Hello { // 1. load Hello.so static { System.loadLibrary("Hello"); } // 2. define native sayHello() public static native void fromJavaHello(String message); public static native String fromJniHello(); }
跟之前不一的是多了一个方法,新增了从java传入一个String给JNI。
通过之前签名获取方式一,可以得到
public static native void fromJavaHello(java.lang.String); Signature: (Ljava/lang/String;)V public static native java.lang.String fromJniHello(); Signature: ()Ljava/lang/String;
之前说过JNI动态注册的优点
灵活性高, 更改类名,包名或方法名时, 只需对更改模块进行少量修改, 效率高
我们新增了一个方法或改了方法名,也就是只需要修改对应类名,包名和方法名即可。
在上一个动态注册代码基础上修改
修改包名类名
//定义Hello.java类路径[包名+类名,只不过.换成了/] //com.biumall.dynamic.one.Hello #define DYNAMIC_CLASS "com/biumall/dynamic/one/Hello"
由于在之前基础上改,包名和类名都没变。
这里我们可以保持一致
修改方法名
由于方法名变或新增了了
public static native void fromJavaHello(String message); public static native String fromJniHello();
因此我们需要创建对应的native方法(命名不一定要跟我一样,native_+java方法名,只是方便阅读,看个人风格)
JNIEXPORT void JNICALL native_fromJavaHello(JNIEnv *env, jclass jc, jstring js){ //Java String转char *str const char *str = (*env)->GetStringUTFChars(env, js, 0); LOGE("native_fromJavaHello : %s ", str); (*env)->ReleaseStringUTFChars(env, js, str); } JNIEXPORT jstring JNICALL native_fromJniHello(JNIEnv *env, jclass jc){ return (*env)->NewStringUTF(env, "Hello from JNI!"); }
新增了方法,因此需要让java和c方法对应起来。也就需要修改method_table即可。
//定义Java和JNI函数的绑定表 // 方法数组,分别为:(方法名[java层定义的],方法签名,函数指针[c层对应替换的方法]) // 可以通过javac和javap 获取 方法签名 JNINativeMethod method_table[]= { {"fromJavaHello", "(Ljava/lang/String;)V", (void*) native_fromJavaHello}, {"fromJniHello", "()Ljava/lang/String;", (void*) native_fromJniHello}, };
其他的不用变。
然后ndk-build和运行起来了。
相对于静态注册,动态注册是非常方便的。只需要修改的包名,类名和方法即可!
参考文章
《》
© 版权声明