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

来源:互联网 发布:小甲鱼零基础c语言视频 编辑:程序博客网 时间:2024/06/10 21:21

在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
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 古典风 古典交响乐 古典之殇 古典摄影 古典文化墙 古典背景图 古典的 新古典玄关 古典窗户 古典摔跤 古典芭蕾 古典文化 古典灯具 古典照片 古典人物画 古典床 古典名曲 古典门牌 新古典灯具 古典芭蕾舞 古典logo 成人古典另类 阿尔罕布拉古典吉他 苏州古典园林 古典吉他民谣吉他 新古典欧式装修效果图 古典建筑设计 新古典玄关柜 陈志古典吉他教程 古典吉他教学 古典吉他品牌 英式古典风格 新古典风格特点 中式古典别墅 古典欧式装修 新古典背景墙 法式古典风格 新古典装修样板房 中式古典装饰 欧式古典装修 古典 旗袍 婚纱照