C++调用JAVA对象的动态方法
扫描二维码
随时随地手机看文章
数据类型签名对照表: 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封装了他,只需要调用: QAndroidJniObject::fromString("字符串"); 返回一个String对象,使用的时候JNI识别jstring,需要强制转换: 对象.object()); 转换成jstring
QtAndroid::androidActivity() QtAndroid::androidActivity() 返回当前安卓层的Activity对象。
调用动态对象的动态方法: 对象.callMethod("方法名","参数类型签名",参数)
例子:调用安卓窗口中封装的Toask函数。
//JAVA层 public class QtActivity extends Activity { .... ... .. void QMessage(String s) { Toast toast = Toast.makeText(this, s, 500); toast.show(); } }
//C++调用 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"; }); }
或使用静态方法获取java对象,然后调用之:
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; }