相关疑难解决方法(0)

NDK - 如何在另一个项目中使用生成的.so库

我已成功使用ndk .so在一个项目中构建和使用文件.我需要在另一个项目中使用这个库.我宁愿不复制源代码,只是使用库.

尝试将整个复制并粘贴libs/armeabi/libcommon.so到项目根目录不起作用,我认为因为libs/armeabi是一个android生成的路径.

那么最好的方法是什么呢?

我正在使用Eclipse-Galileo&ndk5.

java-native-interface android android-ndk

43
推荐指数
3
解决办法
4万
查看次数

Android NDK/JNI:构建依赖于其他共享库的共享库

我正在编写一个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 NDK:使用预编译的静态库链接

它是关于静态库的,但也许我遇到了类似的问题.要点是我需要为每个库声明一个模块.所以我的新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

17
推荐指数
2
解决办法
2万
查看次数

从Android本机活动加载第三方共享库

我已将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)

android shared-libraries android-ndk

15
推荐指数
2
解决办法
2万
查看次数