Qt安卓JNI交互之(2) C++调用JAVA对象的动态方法(1)
2016-06-27 19:21
543 查看
数据类型签名对照表: 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; }
相关文章推荐
- VC++ CEdit 滚动条自动向下滚动
- C语言求两个数的最大公约数的三种算法
- C++中复制构造函数与重载赋值操作符总结
- C++面向对象编程解决三阶矩阵相加减
- vs2010 boost_1_61_0 win7 配置
- c语言大小写转化
- 资源网址
- leetcode 罗马数字与整数的转换算法
- 编写一个删除C语言程序中所有注释语句的程序
- C++程序(百元买百鸡、分出奇偶数、鸡兔同笼问题、选择排序法、整数奇偶排序)
- 可变参数宏__VA_ARGS__
- c++获取系统时间,精确到ms级
- SDUTACM素数判定
- C语言运算符优先级
- C++ COM 开发 Hello World V2
- C/C++函数指针变量调用函数
- 学习C++是一些真实经验!
- c++获取读写文本权限
- C++编程:ASCII,UTF-8,Unicode字符串相互转换
- c++之类与对象