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

本文将带你了解Android应用开发Android Studio3.0开发JNI流程------Java多态性在JNI的表现形式,希望本文对大家学Android有所帮助。

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

Java代码很简单

public static native String   tt();

public static String t(){

Listl = 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代码:

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

.registers 2

.prologue

.line 37

new-instance v0,   Ljava/util/LinkedList;

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

.line 38

.local v0,   ""l"":Ljava/util/List;,   ""Ljava/util/List;""

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

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值