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.
)