Я создал минимальное 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 и как это сделать?
Заранее спасибо.