2012-09-23 35 views
8

AAssetManagerを使用してandroid apkからアセットにアクセスしようとしています。しかし、私は"AAssetManager_fromJavaへの未定義参照"を取得していますが、asset_manager.hとasset_manager_jni.hを含めました。 AAssetManager_openDir(mgr、 "")などのasset_manager.hの他の関数も参照できません。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

私の間違い。私は "アンドロイド"ライブラリをリンカーに追加していませんでした。 Visual Studio ExpressでNDK dev環境を実際にセットアップしていて、デフォルトでは "android"ライブラリがプロジェクトに追加されませんでした。

メークファイルを使用している場合は、ネイティブAssetManagerを使用する場合は、LOCAL_LDLIBSに-landroidを必ず追加してください。

+0

LOCAL_LDLIBSに-landroidをAndroid.mkファイルに追加しても同じ問題が発生します – Ege

+0

@Egeは問題を解決しました.. –

+0

#LifeSaver ありがとうございます – FrickeFresh

1

私はあなたが "と呼ばれるファイルをExternalNativeBuildしている場合は、次の

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

2

に以下を追加することによって、それを修正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}) 

あなたもそれがgreatfully作品であるあなたがeasylyこの

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

を追加することができますネイティブのlibを持っている場合!

1

のAndroid Studioの開発者をgradle.buildに追加Android.mk

LOCAL_SHARED_LIBRARIES += libandroid