Android Studio3.0开发JNI流程------Java多态性在JNI的表现形式

本文介绍了在Android Studio 3.0中进行JNI开发时遇到的Java多态性问题。通过一个简单的Demo演示了如何在JNI中处理Java的父类与子类关系,特别是List与LinkedList的实例化。在JNI代码中,使用jobject表示Java的引用类型,并通过工具类查找类和方法,实现Java方法的本地调用。附带的smali代码有助于深入理解这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在DNK开发中,会莫名遇到Java多态性,什么子类,父类的问题,今天就写一个简单的Demo供大家学习下吧。

Java代码很简单

  public static native String tt();

    public static String t(){
        List<String> l = new LinkedList();
        l.add("123");   //模拟假数据,并不是获取这些数据,其实数据在jni中实现的...
        l.add("456");
        return l.get(1);
    }

其中,类中的本地t( )方法就需要在jni中实现,就是tt( )本地(native)方法实现t( )方法

jni代码:

jstring tt(JNIEnv *env, jclass type){

    LOGE(".....测试java多态在jni的表现形式.....");

    jobject l;   //定义一个jobject

    jclass linkedList_clazz = findClass(env, "java/util/LinkedList");

    jobject linkedList_obj = newObject(env, linkedList_clazz);

    l=linkedList_obj;

    jclass list_clazz = findClass(env, "java/util/List");

    //Ljava/util/List;->add(Ljava/lang/Object;)Z

    jmethodID add_methodID = getMethodID(env, list_clazz, "add", "(Ljava/lang/Object;)Z");

    jmethodID get_methodID = getMethodID(env, list_clazz, "get", "(I)Ljava/lang/Object;");

    //
    env->CallBooleanMethod(l,add_methodID,env->NewStringUTF("数据1"));

    env->CallBooleanMethod(l,add_methodID,env->NewStringUTF("数据2"));

    //Ljava/util/List;->get(I)Ljava/lang/Object;

    jobject data = env->CallObjectMethod(l, get_methodID,1);  //获取第二个数据,集合从角标0开始

    return (jstring)data;
}

代码说明:

java代码

List l = new LinkedList();
List是父类,而LinkedList是List的子类,创建(new)对象的过程其实是Java多态的表现形式。

jni代码

jobject l 定义对象,其实表现形式就是List l
在jni中所有的引用类型超类(父类)都是jobject(除String类型外)。
上述代码中findClass、getMethodID、newObject都是本人自己写的工具类,其实就是找类,找方法,创建对象而已,就和env->findClass原理一样

补上部分smali代码<如果了解Android反编译就很容易理解了>:

.method public static t()Ljava/lang/String;
    .registers 2

    .prologue
    .line 37
    new-instance v0, Ljava/util/LinkedList;

    invoke-direct {v0}, Ljava/util/LinkedList;-><init>()V

    .line 38
    .local v0, "l":Ljava/util/List;, "Ljava/util/List<Ljava/lang/String;>;"
    const-string v1, "123"

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 39
    const-string v1, "456"

    invoke-interface {v0, v1}, Ljava/util/List;->add(Ljava/lang/Object;)Z

    .line 40
    const/4 v1, 0x1

    invoke-interface {v0, v1}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v1

    check-cast v1, Ljava/lang/String;

    return-object v1
.end method

.method public static native tt()Ljava/lang/String;
.end method

运行结果:

12-25 20:34:13.450 8025-8025/com.tencent.mm.wvs E/====捕获====: .....测试java多态在jni的表现形式.....
12-25 20:34:13.451 8025-8025/com.tencent.mm.wvs E/fj: 获取list的第二个数据为:数据2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值