Undefined ссылка на AAssetManager_fromJava
Я пытаюсь получить доступ к активам из anroid apk с помощью AAssetManager. Однако я продолжаю получать
"Undefined ссылка на AAssetManager_fromJava", хотя я включил asset_manager.h и asset_manager_jni.h
Другие функции от asset_manager.h, такие как AAssetManager_openDir (mgr, "") и т.д., Также не могут быть указаны.
Здесь полный код
#define EXPORT_API
#include <string.h>
#include <jni.h>
#include <android\log.h>
#include <sys\types.h>
#include <android\asset_manager.h>
#include <android\asset_manager_jni.h>
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "com.devin - native", __VA_ARGS__)
JNIEnv* env=0;
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* pvt){
LOGD("JNI_OnLoad() called");
vm->AttachCurrentThread(&env, 0);
return JNI_VERSION_1_2;
}
EXPORT_API void LoadAsset(char* filename, jobject assetManager){
AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
/* More stuff */
}
#ifdef __cplusplus
};
#endif
Этот код находится в файле .cpp и скомпилирован с NDK R8. Я делаю здесь что-то ужасно?
Ответы
Ответ 1
Моя ошибка. У меня не было библиотеки "android", добавленной в компоновщик. Я действительно установил среду NDK dev на Visual Studio Express, и по умолчанию в мой проект не добавлена библиотека "android".
Если вы используете make файлы, обязательно добавьте -landroid в свой LOCAL_LDLIBS при использовании собственного AssetManager.
Ответ 2
Разработчики Android Studio, если у вас есть файл ExternalNativeBuild, который называется CMakeList.txt, вы должны добавить этот код в файл CMakeList.txt.
find_library( # Sets the name of the path variable.
android-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
android )
target_link_libraries(
${log-lib}
${android-lib})
если у вас также есть родная библиотека, вы можете легко добавить, как это
target_link_libraries( native-lib
${log-lib}
${android-lib})
Он должен работать!
Ответ 3
Я добавил следующее в gradle.build
android.ndk {
ldLibs.addAll(["android", "log"])
}
Ответ 4
Я исправил это, добавив следующее к Android.mk
LOCAL_SHARED_LIBRARIES += libandroid
Ответ 5
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log
)
find_library(android-lib android)
target_link_libraries( # Specifies the target library.
hll
${log-lib}
${android-lib}
# Links the target library to the log library
# included in the NDK.
)