-
Bug
-
Resolution: Incomplete
-
P1: Critical
-
None
-
5.11.0
-
Phone System: Android 9
QT version : Qt 5.11
-
-
3
First, talk about my work environment, they are Qt 5.11, NDK-r10e, and sdk-tools-windows-4333796. And then based on this environment, I make a demo to verify the idea of use JNI method to link Java and C++ method. When I finish the code, compile it, that is no error. But build it on the phone, there is one mistake. It is like this:
java.lang.UnsatisfiedLinkError: No implementation found for void org.qtproject.example.DataNatives(int, int)....
I read the issue https://bugreports.qt.io/browse/QTBUG-68488, but I don't know where I should add the "System.loadLibrary("TestAndroid_5_11")". (libTestAndroid_5_11 is the *so file name of my program.).
Here is how I do that:
- First, I use JNI_OnLoad method to register the native method, like this:
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
Q_UNUSED(reserved);
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK)
{
return -1;
}
JNINativeMethod javaMethods[]{
{"nativeSendData", "(II)V", reinterpret_cast<void*>(jniSendData)}
};
QAndroidJniEnvironment jniEnv;
if (jniEnv->ExceptionCheck())
{
jniEnv->ExceptionDescribe();
jniEnv->ExceptionClear();
}
jclass objectClass = jniEnv->FindClass("qtTest/DataNatives");
if(!objectClass)
{
qWarning() << "setNativeMethods....Couldn't find class:" << kJniClassName;
return;
}
jint val = jniEnv->RegisterNatives(objectClass, javaMethods, sizeof(javaMethods) / sizeof(javaMethods[0]));
if (val < 0)
{
qWarning() << ":setNativeMethods....Error registering methods: " << val;
}
else
{
qDebug() << "setNativeMethods....Native Functions Registered";
}
if (jniEnv->ExceptionCheck())
{
jniEnv->ExceptionDescribe();
jniEnv->ExceptionClear();
}
return JNI_VERSION_1_6;
}
- then, I make the java method ,like this:
package qtTest; import android.os.Bundle; import android.util.Log; import org.qtproject.qt5.android.bindings.QtActivity; class DataNatives { public static native void nativeSendData(int val1, int val2); } public class TestActivity extends QtActivity { @Override protected void onResume() { super.onResume(); Log.i("TestActivity","onResume"); DataNatives.nativeSendData(1, 2); } @Override public void onWindowFocusChanged(boolean hasFocus) { Log.i("TestActivity","onWindowFocusChanged"); DataNatives.nativeSendData(3, 4); super.onWindowFocusChanged(hasFocus); } }
- Last, I make the C++ method, like this:
static void jniSendData(JNIEnv *envA, jobject thizA, jint val1, jint val2) { Q_UNUSED(thizA); if (val1 != 0) { qDebug()<<"jniSendData----val1="<<val<<",val2="<<val2; envA->ReleaseByteArrayElements(val1, val2, JNI_ABORT); } }
So how can I solve this problem?