Qt C++和Java相互调用

Qt C++和Java相互调用

1. C++调用Java

Test.h

class Test: public QObject
{
public:
	void callJavaMethodPrintHello();
}

Test.cpp

void Center::callJavaMethodPrintHello()
{
	//这里相当于获取MainActibity.java里的类对象
    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代码方面新手可能不太会传参和接受返回数据,下边的图标符号对应的类型供参考
在这里插入图片描述

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中在你想要调用的地方调用即可。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是一个简单的示例程序: 首先,我们需要在Qt中使用Java Native Interface(JNI)来调用Java代码。在Qt中,我们可以使用QAndroidJniObject类来实现这一点。 接下来,我们需要使用Android SDK中的ZXing库来实现二维码扫描。为了使用ZXing,我们需要在Qt中导入ZXing库的Java代码。 因此,我们需要在Qt工程中添加以下文件: 1. ZXing Android库文件 将ZXing库的Android代码导入到Qt工程中。这可以通过将zxing-core-3.3.3.jar文件(或最新版本)复制到Qt工程的android/libs目录中来实现。 2. Java代码 ``` package com.example.qrcode; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.google.zxing.BarcodeFormat; import com.google.zxing.DecodeHintType; import com.google.zxing.Result; import com.google.zxing.client.android.BeepManager; import com.google.zxing.client.android.CaptureActivityHandler; import com.google.zxing.client.android.DecodeFormatManager; import com.google.zxing.client.android.DecodeHintManager; import com.google.zxing.client.android.InactivityTimer; import com.google.zxing.client.android.IntentSource; import com.google.zxing.client.android.PreferencesActivity; import com.google.zxing.client.android.ResultHandler; import com.google.zxing.client.android.ResultHandlerFactory; import com.google.zxing.client.android.camera.CameraManager; import com.google.zxing.client.android.result.ResultHandler; import com.google.zxing.client.android.result.ResultHandlerFactory; import java.io.IOException; import java.util.ArrayList; import java.util.EnumMap; import java.util.List; import java.util.Map; public class ScanActivity extends Activity implements SurfaceHolder.Callback { private static final String TAG = ScanActivity.class.getSimpleName(); private CaptureActivityHandler handler; private CameraManager cameraManager; private Result savedResultToShow; private ViewfinderView viewfinderView; private TextView statusView; private Button buttonBack; private BeepManager beepManager; private InactivityTimer inactivityTimer; private List<BarcodeFormat> decodeFormats; private Map<DecodeHintType, ?> decodeHints; private String characterSet; private IntentSource source; /** * 当活动首次创建时调用。 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_scan); // 初始化相机管理器 cameraManager = new CameraManager(getApplication()); viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view); statusView = (TextView) findViewById(R.id.status_view); buttonBack = (Button) findViewById(R.id.button_back); beepManager = new BeepManager(this); inactivityTimer = new InactivityTimer(this); // 显示返回按钮 buttonBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); } /** * 当活动已经可见时调用。 */ @Override public void onResume() { super.onResume(); handler = null; savedResultToShow = null; // 初始化相机视图 SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); if (surfaceHolder == null) { throw new IllegalStateException("No SurfaceHolder?"); } if (cameraManager.isOpen()) { Log.w(TAG, "initCamera() while already open -- late SurfaceView callback?"); return; } try { cameraManager.openDriver(surfaceHolder); // 创建捕获活动处理程序 if (handler == null) { handler = new CaptureActivityHandler(this, decodeFormats, decodeHints, characterSet, cameraManager); } decodeOrStoreSavedBitmap(null, null); } catch (IOException ioe) { Log.w(TAG, ioe); displayFrameworkBugMessageAndExit(); } catch (RuntimeException e) { Log.w(TAG, "Unexpected error initializing camera", e); displayFrameworkBugMessageAndExit(); } // 启动电源管理器和闪光灯 beepManager.updatePrefs(); inactivityTimer.onResume(); source = IntentSource.NONE; decodeFormats = null; characterSet = null; } /** * 当活动不再可见时调用。 */ @Override public void onPause() { if (handler != null) { handler.quitSynchronously(); handler = null; } inactivityTimer.onPause(); beepManager.close(); cameraManager.closeDriver(); if (!hasSurface) { SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); surfaceHolder.removeCallback(this); } super.onPause(); } /** * 当活动被销毁时调用。 */ @Override public void onDestroy() { inactivityTimer.shutdown(); super.onDestroy(); } /** * 处理扫描结果。 * * @param rawResult 扫描结果 * @param barcode 扫描结果的位图 */ public void handleDecode(Result rawResult, com.google.zxing.Result barcode) { inactivityTimer.onActivity(); beepManager.playBeepSoundAndVibrate(); String result = barcode.getText(); Toast.makeText(this, result, Toast.LENGTH_SHORT).show(); // 在状态视图中显示结果 statusView.setText(barcode.getText()); // 将结果保存并显示 savedResultToShow = rawResult; ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, barcode); String displayContents = resultHandler.getDisplayContents(); if (displayContents != null) { statusView.setText(displayContents); } // 将扫描结果返回给Qt应用 QAndroidJniObject jResult = QAndroidJniObject::fromString(result); QAndroidJniObject::callStaticMethod<void>("com/example/qrcode/ScanActivity", "onScanResult", "(Ljava/lang/String;)V", jResult.object<jstring>()); } /** * 在UI线程上显示有关框架错误的消息,并退出应用程序。 */ private void displayFrameworkBugMessageAndExit() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.app_name)); builder.setMessage(getString(R.string.msg_camera_framework_bug)); builder.setPositiveButton(R.string.button_ok, new FinishListener(this)); builder.setOnCancelListener(new FinishListener(this)); builder.show(); } /** * 将扫描结果返回给Qt应用。 */ public static void onScanResult(QString result) { emit scanResult(result); } } ``` 3. Qt代码 ``` #include <QtAndroidExtras> #include <QAndroidJniObject> #include <QDebug> ... // 在Android上扫描二维码 void MainWindow::scanQRCode() { QAndroidJniObject::callStaticMethod<void>("com/example/qrcode/ScanActivity", "startScan", "()V"); } // 处理扫描结果 void MainWindow::onScanResult(QString result) { qDebug() << "Scan result:" << result; } // 处理扫描结果信号 void MainWindow::handleScanResult() { QAndroidJniEnvironment env; if (env->ExceptionCheck()) { env->ExceptionClear(); return; } QAndroidJniObject jResult = QAndroidJniObject::callStaticObjectMethod("com/example/qrcode/ScanActivity", "getResult", "()Ljava/lang/String;"); QString result = jResult.toString(); if (result.isEmpty()) { return; } onScanResult(result); } ... // 连接到扫描结果信号 connect(this, SIGNAL(scanResult(QString)), this, SLOT(onScanResult(QString))); // 请求获取Android权限 QtAndroid::PermissionResultCallback callback = [](const QtAndroid::PermissionResult &result) { if (result == QtAndroid::PermissionResult::Granted) { // 已授权 scanQRCode(); } else { // 未授权 qDebug() << "Permission denied!"; } }; QtAndroid::requestPermissionsSync(QStringList() << "android.permission.CAMERA", callback); ... ``` 这个程序将会请求获取相机权限,然后启动扫描二维码的Activity。扫描结果将被传递回Qt应用程序中的槽函数中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值