Important: Please read the Qt Code of Conduct -

Qt Android with external app

  • Hi,

    After few days of googling and reading post, I'm still bit stuck here, i'm hoping someone can point me to the right place. I have wrote a very simple app using Android studio where the app has a button and use a 3rd party SDK to do the barcode scanning. When I try on the app which i create on the Android Studio, it works perfectly fine but when i try to use the QAndroidJniObject in my Qt app it doesn't work. Here is the java code,

    package com.test.timebarcodescan;
            import android.os.Bundle;
            import android.view.View;
            import android.widget.Button;
            import android.widget.TextView;
    public class MainActivity extends AppCompatActivity {
        TextView tv;
        int count = 0;
        protected void onCreate(Bundle savedInstanceState) {
            tv = (TextView) findViewById(;
        public void onButtonOKClick(View view){
            count += 1;
            String scanResult = scanBarcode();
        static String scanBarcode(){
            Scanner scanner=Scanner.getInstance();
            String result = "";
            if(scanner == null){
                result = "";
            } else{
                try {
                    result = scanner.scan();
                } catch (InterruptedException e) {
            return result;

    I don't know how to link this app with my Qt App, properly with this app or the java code. My Qt app can either to call this app as Indent and get the result after pressing the "Scan" button or use JNI to call the "scanBarcode()" function using QAndroidJniObject. But I have no idea how to it. I read the example, but the app is using qml which i just use the normal MainWindow app type.

    In my Qt app, my on_scanBarcode_clicked() doesn't work when i use the QAndroidJniObject

    void MainWindow::on_scanBarcode_clicked()
        qDebug() <<"Scan button clicked.";
        QAndroidJniObject testObject = QAndroidJniObject::callStaticObjectMethod<jstring>("com/test/timebarcodescan/MainActivity", "scanBarcode");
            qDebug() <<"testObject is valid...";
        } else{
            qDebug() <<"testObject is invalid..";
    ****** My dummy Qt application .pro file********
    # Project created by QtCreator 2016-09-16T12:26:49
    QT       += core gui
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    android {
        QT += androidextras
    TARGET = untitled
    TEMPLATE = app
    SOURCES += main.cpp\
    HEADERS  += mainwindow.h
    FORMS    += mainwindow.ui
    CONFIG += mobility
    DISTFILES += \
        ../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan/AndroidManifest.xml \
        ../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan/gradle/wrapper/gradle-wrapper.jar \
        ../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan/gradlew \
        ../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan/res/values/libs.xml \
        ../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan/build.gradle \
        ../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan/gradle/wrapper/ \
        ../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan/gradlew.bat \
    ANDROID_PACKAGE_SOURCE_DIR = $$PWD/../../../AndriodApp/TimeBarcodeScan/app/src/main/java/com/test/timebarcodescan

    I'm desperate to get some advice/suggestion.

    Or how do i create java code for my qt instead from the Android Studio? i read few post from the google, all the java files seems create from the qt. But when i create it, it's different from the examples.

    Many thanks.

  • I'm not sure about this, but I think there is a special setting
    that you can use to declare your java sources in the .pro configuration.

    Also, you can add some output to your java-method (e.g. a plain System.out.println) to see if your Java scanBarCode-method get's called from the C++ on_scanBarcode_clicked() handler over JNI. Maybe this helps to locate the problem?


  • Moderators

    You can try to explicitly specify the JNI signature:
    QAndroidJniObject::callStaticObjectMethod<jstring>("com/test/timebarcodescan/MainActivity", "scanBarcode", "()Ljava/lang/String;")
    But i expect the same behavior.

    Is the MainActivity class the activity you are using in your Qt app?
    You should use the QtActivity instead (see examples, or generate the templates in QtCreator).
    What i can think of is, that the QtActivity initializes some stuff (like the classloader) used by the QtAndroidJni* classes.

Log in to reply