我正在尝试使用AAssetManager从android apk访问资产。但是,我一直在努力 “未定义的AAssetManager_fromJava引用”,即使我已经包含了asset_manager.h和asset_manager_jni.h asset_manager.h中的其他函数,如AAssetManager_openDir(mgr,“”)等也无法引用。
这是完整的代码
#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进行编译。我在这里做了一件非常错的事吗?
答案 0 :(得分:14)
我的错误。我没有将“android”库添加到链接器中。我实际上在Visual Studio Express上设置了NDK开发环境,默认情况下“android”库没有添加到我的项目中。
如果您使用的是makefile,请确保在使用本机AssetManager时将-landroid添加到LOCAL_LDLIBS。
答案 1 :(得分:6)
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})
它应该有用!
答案 2 :(得分:2)
我将以下内容添加到gradle.build
android.ndk {
ldLibs.addAll(["android", "log"])
}
答案 3 :(得分:1)
我通过在Android.mk中添加以下内容来修复它。
LOCAL_SHARED_LIBRARIES += libandroid
答案 4 :(得分:0)
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.
)