本文将带你了解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频道!