数据类型签名对照表:
jobject
Ljava/lang/Object;
jclass
Ljava/lang/Class;
jstring
Ljava/lang/String;
jthrowable
Ljava/lang/Throwable;
jobjectArray
[Ljava/lang/Object;
jarray
[<type>
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<fully-qualified-name>;
JAVA中的String
String是一个类,在JAVA中非常常用,和C++交互也很常用.QT封装了他,只需要调用:
QAndroidJniObject::fromString("字符串");
返回一个String对象,使用的时候JNI识别jstring,需要强制转换:
对象.object<jstring>()); 转换成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<void>("QMessage","(Ljava/lang/String;)V",str.object<jstring>());
qDebug()<<"WAIT*****END";
});
}
或使用静态方法获取java对象,然后调用之:
c++:
void MyJni::QMessage(QString s)
{
QtAndroid::runOnAndroidThread([=](){
QAndroidJniEnvironment EV;
QAndroidJniObject str =QAndroidJniObject::fromString(s);
QAndroidJniObject selfobj = QAndroidJniObject::callStaticObjectMethod<jobject>("org/qtproject/qt5/android/bindings/QtActivity", "getobj");
selfobj.callMethod<void>("QMessage","(Ljava/lang/String;)V",str.object<jstring>());
});
}
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;
}