JNI动态注册 2

Android 91es.com站长2023年6月29日 am8:08发布12个月前更新
0
导航号,我的单页导航
目录

前言

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

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和运行起来了。

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

参考文章

  1. JNI动态注册

版权声明 1、 本站名称 91易搜
2、 本站网址 https://www.91es.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权请留言
4、 本站禁止发布或转载任何违法的相关信息,如有发现请向站长举报
导航号,我的单页导航

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...