Android编程:Android Studio3.0开发JNI流程-Java多态性在JNI的表现形式
小标 2018-05-23 来源 : 阅读 1759 评论 0

摘要:Android编程学习中,在DNK开发中,会莫名遇到Java多态性,什么子类,父类的问题,今天就写一个简单的Demo供大家学习下吧。希望对大家学习Android编程有所帮助。

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

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);
    }
</string>

   

其中,类中的本地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="">;"
    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</ljava></init>

   

运行结果:

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人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved