前言
接上文《》,介绍了简单的动态注册,这篇是整理一下动态注册的主要修改点。
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和运行起来了。
相对于静态注册,动态注册是非常方便的。只需要修改的包名,类名和方法即可!
参考文章
《》
© 版权声明