未定义的AAssetManager_fromJava引用

dev*_*vin 11 android android-ndk android-assets

我试图使用AAssetManager从Android apk访问资产.但是,我继续得到"未定义的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
Run Code Online (Sandbox Code Playgroud)

此代码位于.cpp文件中,并使用NDK R8进行编译.我在这里做了什么非常错的事吗?

dev*_*vin 14

我的错.我没有将"android"库添加到链接器中.我实际上在Visual Studio Express上设置了NDK开发环境,默认情况下"android"库没有添加到我的项目中.

如果您使用的是makefile,请确保在使用本机AssetManager时将-landroid添加到LOCAL_LDLIBS.


小智 8

Android Studio开发人员,如果您具有名为“ CMakeList.txt”的ExternalNativeBuild文件,则必须将此代码附加到文件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})
Run Code Online (Sandbox Code Playgroud)

如果您还有本机lib,则可以像这样轻松添加

target_link_libraries( native-lib
                   ${log-lib}
                    ${android-lib})
Run Code Online (Sandbox Code Playgroud)

它应该工作!