2012-09-23 16 views
8

Próbuję uzyskać dostęp do zasobów z apk systemu Android za pomocą AAssetManager. Jednak wciąż otrzymuję "Niezdefiniowane odniesienie do AAssetManager_fromJava", mimo że zawarłem asset_manager.h i asset_manager_jni.h Inne funkcje z asset_manager.h, takie jak AAssetManager_openDir (mgr, "") itp. Również nie można się do nich odwoływać.Niezdefiniowane odniesienie do AAssetManager_fromJava

Oto kompletny kod

#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 

Kod ten znajduje się w pliku .cpp i jest skompilowany z NDK R8. Czy robię tu coś strasznego?

Odpowiedz

14

Mój błąd. Nie dodałem biblioteki "android" do linkera. Właściwie skonfigurowałem środowisko programistyczne NDK w Visual Studio Express i domyślnie biblioteka "android" nie została dodana do mojego projektu.

Jeśli używasz plików Makefile, pamiętaj o dodaniu -landroid do LOCAL_LDLIBS podczas korzystania z natywnego AssetManager.

+0

Mam ten sam problem, choć dodaną -landroid do LOCAL_LDLIBS do mojego Android.mk złożyć – Ege

+0

@Ege mają wyraźne swój problem .. –

+0

#LifeSaver Dzięki tak dużo za to – FrickeFresh

1

Naprawiłem go poprzez dodanie następujących do Android.mk

LOCAL_SHARED_LIBRARIES += libandroid 
2

I dodaje następujące do gradle.build

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

1

programistów Android Studio Jeśli masz ExternalNativeBuild plik, który nazywa się " CMakeList.txt "musisz dołączyć ten kod do 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}) 

jeśli masz również rodzimy lib można dodać easyly jak ten

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

że jest on działa greatfully!

Powiązane problemy