Qt C++和Java相互调用
1. C++调用Java
Test.h
class Test: public QObject
{
public:
void callJavaMethodPrintHello();
}
Test.cpp
void Center::callJavaMethodPrintHello()
{
const QAndroidJniObject& activity = QtAndroid::androidActivity();
activity.callObjectMethod("printHello", "()V");
QAndroidJniObject string = QAndroidJniObject::callStaticObjectMethod("net/sun/java/MainActivity", "getHello", "()Ljava/lang/String;");
qDebug()<<"callJavaMethodPrintHello......:"<<string.toString();
jint n = activity.callMethod<jint >("add", "(II)I", 1, 2);
qDebug()<<n;
}
1.const QAndroidJniObject& activity = QtAndroid::androidActivity();相当于获取java里MainActivity的类对象,拿到这个对象开始做其他操作。
2.callObjectMethod、callMethod、callStaticObjectMethod都是调用java代码的方法,具体使用可以参照QT帮助文档QAndroidJniObject类
3.net/sun/java/MainActivity为MainActivity.java的所在路径
4.调用java代码方面新手可能不太会传参和接受返回数据,下边的图标符号对应的类型供参考
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210209161950731.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI5MTUyMjY=,size_16,color_FFFFFF,t_70)
MainActibity.java
public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity
{
private void printHello {
Log.i("@@@", "Hello world!");
}
private static String getHello() {
return "Hello!";
}
private int add(int a, int b) {
return a + b;
}
}
这里没什么好说的,直接写java代码就行,注意C++的参数符号对应的java参数相匹配即可
2. java调用C++
Test.cpp
static void JavaNotify_1()
{
qDebug()<<"C++ JavaNotify_1";
}
static void JavaNotify_2()
{
qDebug()<<"C++ JavaNotify_2";
}
static const JNINativeMethod gMethods[] = {
{ "CallJavaNotify_1", "()V", (void*)JavaNotify_1},
{ "CallJavaNotify_2", "()V", (void*)JavaNotify_2}
};
void RegJni()
{
QtAndroid::runOnAndroidThreadSync([=](){
QAndroidJniEnvironment Environment;
const char* mClassName ="net/sun/java/MainActivity";
jclass j_class;
j_class = Environment->FindClass(mClassName);
if (j_class == nullptr)
{
qDebug()<<"erro clazz";
return ;
}
jint mj = Environment->RegisterNatives(j_class, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
if (mj != JNI_OK)
{
qDebug()<<"register native method failed!";
return;
}else{
qDebug()<<"RegisterNatives success!";
}
});
qDebug()<<"++++++++++++++++++++++++";
}
Center::Center(QObject *parent) : QObject(parent)
{
}
gMethods是一个二维数组,把需要被调用的C++方法和Java方法绑定到一起,建立对应关系,比如,java中调用CallJavaNotify_1相应C++的JavaNotify_1就会被执行。然后Environment->RegisterNatives注册
MainActibity.java
public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity
{
public native void CallJavaNotify_1();
public native void CallJavaNotify_2();
private void callQtFunction(){
CallJavaNotify_1();
}
}
java中在你想要调用的地方调用即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)