Невозможно позвонить с Java на C ++ / Qt в Android Project - PullRequest
0 голосов
/ 24 апреля 2020

Я создал минимальное Android приложение, которое вызывает Java на C ++, чтобы узнать, как это сделать. Это код:

Android App (Main Activity):

package com.example.qttestexample;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.example.libexample.MyClass;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyClass foo = new MyClass();
        foo.printHello();
    }
}

Пакет AAR, в который я помещаю нативные методы:

package com.example.libexample;

class MyJavaNatives {
    static {
        try {

            System.loadLibrary("QtLibExample");
        } catch( UnsatisfiedLinkError e ) {
            System.err.println("!!! Native code library failed to load.\n" + e);
        }
    }

    public static native void printHello();
}

public class MyClass {

    public static void printHello() {

        MyJavaNatives.printHello();
    }
}

Код C ++ / QT:

#ifndef QTLIBEXAMPLE_H
#define QTLIBEXAMPLE_H

#include "QtLibExample_global.h"

#include <jni.h>
#include <QDebug>


static void printHello(JNIEnv */*env*/, jobject /*obj*/)
{
    qDebug() << "Hello World";
}

static JNINativeMethod methods[] = {
    { "printHello",
        "(V)V", // const char* function signature
        (void *)printHello // function pointer
    }
};

extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{
    JNIEnv* env;
    // get the JNIEnv pointer.
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6)
           != JNI_OK) {
        return JNI_ERR;
    }

    // step 3
    // search for Java class which declares the native methods
    jclass javaClass = env->FindClass("com/example/libexample/MyJavaNatives");
    if (!javaClass)
        return JNI_ERR;

    // step 4
    // register our native methods
    if (env->RegisterNatives(javaClass, methods,
                            sizeof(methods) / sizeof(methods[0])) < 0) {
        return JNI_ERR;
    }
    return JNI_VERSION_1_6;
}

#endif // QTLIBEXAMPLE_H

Когда я его выполняю, приложение cra sh и я получаю следующее:

2020-04-24 11:59:12.517 28131-28131/com.example.qttestexample W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: library "libQt5Core.so" not found
My library (.so) is placed in libexample/src/main/jniLibs/x86

Я могу понять из сообщения, что зависимость libQt5Core.so не разрешена, так как у меня нет этой библиотеки, скопированной в любом месте, и она ссылки из моей библиотеки при использовании, например, QDebug, но мой вопрос, как я могу решить это? что мне нужно добавить в мой проект в Android Studio или Qt и как это сделать?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...