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()); 转换成jstringQtAndroid::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;
} 




