數(shù)據(jù)類型簽名對照表: jobject Ljava/lang/Object; jclass Ljava/lang/Class; jstring Ljava/lang/String; jthrowable Ljava/lang/Throwable; jobjectArray [Ljava/lang/Object; jarray [jbooleanArray [Z jbyteArray [B jcharArray [C jshortArray [S jintArray [I jlongArray [J jfloatArray [F jdoubleArray [D Primitive?Types jboolean Z jbyte B jchar C jshort S jint I jlong J jfloat F jdouble D void V Custom?type L;
JAVA中的String String是一個類,在JAVA中非常常用,和C++交互也很常用.QT封裝了他,只需要調(diào)用: QAndroidJniObject::fromString("字符串"); 返回一個String對象,使用的時候JNI識別jstring,需要強制轉(zhuǎn)換: 對象.object());??轉(zhuǎn)換成jstring
QtAndroid::androidActivity()?? QtAndroid::androidActivity()?返回當前安卓層的Activity對象。
調(diào)用動態(tài)對象的動態(tài)方法: 對象.callMethod("方法名","參數(shù)類型簽名",參數(shù))
例子:調(diào)用安卓窗口中封裝的Toask函數(shù)。
//JAVA層 public?class?QtActivity?extends?Activity { .... ... .. void??QMessage(String?s) ????{ ????????Toast??toast?=??Toast.makeText(this,?s,?500); ????????toast.show(); ????} }
//C++調(diào)用 ?void?MyJni::QMessage(QString?s) ?{ ?????QtAndroid::runOnAndroidThread([=](){ ?????????QAndroidJniEnvironment???EV; ??????????QAndroidJniObject?activity?=QtAndroid::androidActivity(); ?????????QAndroidJniObject?str?=QAndroidJniObject::fromString(s); ??????????activity.callMethod("QMessage","(Ljava/lang/String;)V",str.object()); ??????????qDebug()<<"WAIT*****END"; ?????}); ?}
或使用靜態(tài)方法獲取java對象,然后調(diào)用之:
c++: ?void?MyJni::QMessage(QString?s) ?{ ?????QtAndroid::runOnAndroidThread([=](){? ?????????QAndroidJniEnvironment???EV; ?????????QAndroidJniObject?str?=QAndroidJniObject::fromString(s); ??????????QAndroidJniObject?selfobj?=?QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/bindings/QtActivity",?"getobj"); ??????????selfobj.callMethod("QMessage","(Ljava/lang/String;)V",str.object()); ?????}); ?} JAVA: ?public?static?QtActivity?selfObj?=null; ????public?QtActivity() ????{ ????????selfObj?=?this; ????????m_loader?=?new?QtActivityLoader(this); ????????if?(Build.VERSION.SDK_INT?>=?21)?{ ????????????QT_ANDROID_THEMES?=?new?String[]?{"Theme_Holo_Light"}; ????????????QT_ANDROID_DEFAULT_THEME?=?"Theme_Holo_Light"; ????????}?else?{ ????????????QT_ANDROID_THEMES?=?new?String[]?{"Theme_DeviceDefault_Light"}; ????????????QT_ANDROID_DEFAULT_THEME?=?"Theme_DeviceDefault_Light"; ????????} ????} public??static??Object?getobj(){ ????????return?selfObj; ????}