After a long search I found the solution in the code of Qt itself. The final result is a modification of the original code found here: [QT_SOURCE] /qtbase/src/plugins/platforms/android/src/androidjnimain.cpp. You should put the code in a cpp of the application that needs the pointer to AAssetManager.
@
#include <jni.h>
#include <android/asset_manager_jni.h>
static JavaVM* javaVM = NULL;
static AAssetManager* m_assetManager = NULL;
static jclass m_applicationClass = NULL;
static jobject m_activityObject = NULL;
#define MY_FIND_AND_CHECK_CLASS(CLASS_NAME)
clazz = env->FindClass(CLASS_NAME);
if (!clazz) {
qDebug() << "No se encontrĂ³ la clase :(";
return JNI_FALSE;
}
#define MY_GET_AND_CHECK_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE)
VAR = env->GetMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE);
if (!VAR) {
qDebug() << "No se encontrĂ³ el metodo :(";
return JNI_FALSE;
}
#define MY_GET_AND_CHECK_STATIC_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE)
VAR = env->GetStaticMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE);
if (!VAR) {
qDebug() << "No se encontrĂ³ el metodo estatico :(";
return JNI_FALSE;
}
static int findAssets(JNIEnv *env)
{
jclass clazz;
MY_FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/QtNative");
m_applicationClass = static_cast<jclass>(env->NewGlobalRef(clazz));
jmethodID methodID;
MY_GET_AND_CHECK_STATIC_METHOD(methodID, m_applicationClass, "activity", "()Landroid/app/Activity;");
jobject activityObject = env->CallStaticObjectMethod(m_applicationClass, methodID);
m_activityObject = env->NewGlobalRef(activityObject);
MY_FIND_AND_CHECK_CLASS("android/content/ContextWrapper");
MY_GET_AND_CHECK_METHOD(methodID, clazz, "getAssets", "()Landroid/content/res/AssetManager;");
m_assetManager = AAssetManager_fromJava(env, env->CallObjectMethod(activityObject, methodID));
return JNI_TRUE;
}
extern "C"
{
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */reserved/)
{
qDebug() << "JNI_OnLoad :)";
typedef union {
JNIEnv *nativeEnvironment;
void *venv;
} UnionJNIEnvToVoid;
qDebug() << "UNION declarada :)";
UnionJNIEnvToVoid uenv;
uenv.venv = NULL;
javaVM = 0;
if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
qDebug() << "No hay puntero al ambiente :(";
return -1;
}
qDebug() << "Hay puntero al ambiente :)";
JNIEnv *env = uenv.nativeEnvironment;
if (!findAssets(env)) {
qDebug() << "No se obtuvo puntero a al AAssetManager :(";
return -1;
}
qDebug() << "Fuck yea!!! :)";
javaVM = vm;
return JNI_VERSION_1_4;
}
}
@