2012-09-23 19 views
8

Sto tentando di accedere alle risorse da un apk di Android utilizzando AAssetManager. Tuttavia, continuo a ricevere "Riferimento non definito a AAssetManager_fromJava" anche se ho incluso asset_manager.h e asset_manager_jni.h Altre funzioni di asset_manager.h, come AAssetManager_openDir (mgr, "") ecc. Non possono essere referenziate.Riferimento non definito a AAssetManager_fromJava

Ecco il codice completo

#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 

Questo codice è in un file cpp e di essere compilato con NDK R8. Sto facendo qualcosa di terribilmente sbagliato qui?

risposta

14

Il mio errore. Non avevo aggiunto la libreria "android" al linker. In realtà ho impostato l'ambiente di sviluppo NDK su Visual Studio Express e la libreria "android" non è stata aggiunta al mio progetto per impostazione predefinita.

Se si utilizzano i makefile, assicurarsi di aggiungere -landroid a LOCAL_LDLIBS quando si utilizza AssetManager nativo.

+0

Ho lo stesso problema, anche se ho aggiunto -landroid ai tuoi LOCAL_LDLIBS al mio Android.mk presentare – Ege

+0

@Ege hanno chiare il problema .. –

+0

#LifeSaver Grazie mille per questo – FrickeFresh

1

ho riparato con l'aggiunta di seguito per Android.mk

LOCAL_SHARED_LIBRARIES += libandroid 
2

ho aggiunto il testo seguente gradle.build

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

1

sviluppatori Android Studio se avete il file che si chiama ExternalNativeBuild " CMakeList.txt "devi aggiungere questo codice a 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}) 

se hai anche nativo lib è possibile aggiungere easyly come questo

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

Cioè funziona greatfully!

Problemi correlati