我已成功使用ndk .so在一个项目中构建和使用文件.我需要在另一个项目中使用这个库.我宁愿不复制源代码,只是使用库.
尝试将整个复制并粘贴libs/armeabi/libcommon.so到项目根目录不起作用,我认为因为libs/armeabi是一个android生成的路径.
那么最好的方法是什么呢?
我正在使用Eclipse-Galileo&ndk5.
我正在编写一个Android应用程序,希望将JNI调用成为使用NDK构建的共享库.诀窍是这个共享库调用OTHER共享库提供的函数.其他共享库是已在其他地方编译的C库.
这是我尝试过的:
我的环境: 我在Eclipse工作.我添加了原生支持并拥有一个jni库.在那个库中,我有我的代码和\ lib目录,我已经复制了我的其他.so文件.
尝试#1 Android.mk:告诉它libs在哪里
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native_lib
LOCAL_SRC_FILES := native_lib.cpp
LOCAL_LDLIBS := -L$(SYSROOT)/../usr/lib -llog
LOCAL_LDLIBS += -L$(LOCAL_PATH)/lib/support_lib1
LOCAL_LDLIBS += -L$(LOCAL_PATH)/lib/support_lib2
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
这构建得很好,但是当我尝试运行时,我得到错误,表明dlopen(libnative_lib)失败,因为它无法加载libsupport_lib1.
来到这里我发现了这个:
这说我需要在所有必要的库上调用load库.大!
尝试#2首先打开每个库
static {
System.loadLibrary("support_lib1");
System.loadLibrary("support_lib2");
System.loadLibrary("native_lib");
}
Run Code Online (Sandbox Code Playgroud)
再次,这构建得很好,但是当我运行时,我得到一个新的错误:
无法加载libsupport_lib1.findLibrary返回null.
现在我们到了某个地方.它不能将库加载到目标.
尝试#3将.so文件复制到project/libs/armeabi中
没工作.当Eclipse构建时,它删除了我放在那里的文件.
尝试#4为每个库创建一个新模块
那么我发现了这个:
它是关于静态库的,但也许我遇到了类似的问题.要点是我需要为每个库声明一个模块.所以我的新Android.mk看起来像这样:
LOCAL_PATH := $(call my-dir)
#get support_lib1
include $(CLEAR_VARS)
LOCAL_MODULE := support_lib1
LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/support_lib1.so
include $(BUILD_SHARED_LIBRARY)
#get support_lib2
include $(CLEAR_VARS)
LOCAL_MODULE := support_lib2
LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/support_lib2.so
include $(BUILD_SHARED_LIBRARY) …Run Code Online (Sandbox Code Playgroud) java-native-interface linker android shared-libraries android-ndk
我已将Assimp库构建为共享库.我把它包含在我的Android ndk项目中并且它构建正常但是当我加载它时我收到以下错误:无法加载本机库:My-Native-Activity.
(也许我应该补充一点,当我没有包含库并且我已经检查了apk并且在设备上时我的活动正常工作;库被添加到libs文件夹并安装在/ data/data/my中的设备上-app/lib中.)
我已经做了很多阅读,似乎解决这个问题的唯一方法是在启动我的本机活动之前使用System.loadLibrary加载它们.我想我更喜欢在采用这种方法之前使用dlopen动态加载它们.
我是否正确假设Android不会自动加载共享库我的原生活动(即我的共享库)取决于?
我会将它构建为一个静态库,但它超过54Mb不能工作.
这是我的Android.mk:我尝试将-lassimp添加到LOCAL_LDLIBS.我不确定这是否正确但它没有任何区别.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := assimp
LOCAL_SRC_FILES := libassimp.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := native-activity
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2
LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_SHARED_LIBRARIES := assimp
LOCAL_CPPFLAGS += -march=armv7-a -mfloat-abi=softfp
LOCAL_CFLAGS := $(LOCAL_CPPFLAGS)
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_C_INCLUDES += $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
Run Code Online (Sandbox Code Playgroud)