2012-09-23 16 views
8

我正在嘗試使用AAssetManager從Android版本中訪問資產。但是,我一直收到 「未定義的引用AAssetManager_fromJava」,即使我已經包含asset_manager.h和asset_manager_jni.h asset_manager.h的其他函數,如AAssetManager_openDir(mgr,「」)等也無法引用。對AAssetManager_fromJava的未定義引用

下面是完整的代碼

#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編譯。我在這裏做錯了什麼嗎?

回答

14

我的錯誤。我沒有將「android」庫添加到鏈接器中。我實際上在Visual Studio Express上設置了NDK開發環境,默認情況下「android」庫沒有添加到我的項目中。

如果您使用的是生成文件,請務必在使用本地AssetManager時將-landroid添加到LOCAL_LDLIBS。

+0

我,即使我添加-landroid你LOCAL_LDLIBS我Android.mk文件 – Ege

+0

@Ege有明確您的問題.. –

+0

#LifeSaver 非常感謝這個同樣的問題 – FrickeFresh

1

我固定它通過添加以下內容的Android.mk

LOCAL_SHARED_LIBRARIES += libandroid 
2

我增加了以下內容gradle.build

android.ndk { ldLibs.addAll(["android", "log"]) }

1

的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}) 

如果你也有本地庫,你可以添加easyly這樣

target_link_libraries(native-lib 
        ${log-lib} 
        ${android-lib}) 

這就是它的工作原理greatfully!