15

AAssetManagerを使用してAndroidAPKからアセットにアクセスしようとしています。ただし、asset_manager.hとasset_manager_jni.hを含めても、「AAssetManager_fromJavaへの未定義の参照」が表示され続けます。AAssetManager_openDir(mgr、 "")などのasset_manager.hの他の関数も参照できません。

これが完全なコードです

#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ファイルにあり、NDKR8でコンパイルされています。私はここでひどく間違ったことをしていますか?

4

5 に答える 5

17

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

makefileを使用している場合、ネイティブAssetManagerを使用するときは、必ず-landroidをLOCAL_LDLIBSに追加してください。

于 2012-09-23T12:29:15.893 に答える
16

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

ネイティブライブラリもある場合は、このように簡単に追加できます

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

うまくいくはずです!

于 2017-04-04T13:45:13.510 に答える
3

以下をgradle.buildに追加しました

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

于 2016-01-18T17:38:05.943 に答える
3
find_library( # Sets the name of the path variable.
    log-lib

    # Specifies the name of the NDK library that
    # you want CMake to locate.
    log
)

find_library(android-lib android)

target_link_libraries( # Specifies the target library.
    hll
    ${log-lib}
    ${android-lib}
    # Links the target library to the log library
    # included in the NDK.
)
于 2018-08-31T02:24:44.693 に答える
1

Android.mkに以下を追加して修正しました

LOCAL_SHARED_LIBRARIES += libandroid
于 2014-01-03T18:14:58.307 に答える