Android NDK 并加入新的共享库

Android NDK and dropping in new shared libraries

我有一个问题,为什么我不能简单地在 Android 中放入新的共享库而不通过 NDK-build 重新编译。这是我的工作:

使用 Android Studio 和最近发布的 Android NDK,我已经能够编译一个使用 C 代码的应用程序,它引用了一个共享库。我编译共享库:

GCC := /xxx/AndroidStudioProjects/android-ndk-r10d/toolchains/x86-4.6/prebuilt/windows/bin/i686-linux-android-gcc.exe
GPP :=/xxx/AndroidStudioProjects/android-ndk-r10d/toolchains/x86-4.6/prebuilt/windows/bin/i686-linux-android-g++.exe
AR  := /xxx/AndroidStudioProjects/android-ndk-r10d/toolchains/x86-4.6/prebuilt/windows/bin/i686-linux-android-ar.exe

OPTIONS  :=\
 -ffunction-sections \
 -funwind-tables  \
 -DANDROID 

default: all
all: obj
    $(AR) r libmathadd.so mathadd.o

obj:
    $(GCC) $(OPTIONS) -c mathadd.c

这给了我我的 .so 文件。我现在 运行 我的 ndk-build 使用 Android.mk makefile:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE           := mathadd
LOCAL_SRC_FILES        :=./libmathadd.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE    := ndk1
 LOCAL_SRC_FILES := native.c
 LOCAL_SHARED_LIBRARIES := mathadd
 include $(BUILD_SHARED_LIBRARY)

在此之后,我有我的 ndk1 .so 文件和我的 mathadd .so 然后我将它们放在一个文件夹目录中:

app -> src -> jniLibs -> x86 -> libmathadd.so

app -> src -> jniLibs -> x86 -> libndk1.so

我在我的模拟器上编译并运行,一切正常!

现在我的问题来了。 我稍微修改了我的共享库源 (mathadd.c)。我使用第一个 make 文件重新编译它并将其直接放入应用程序树中(无需重建本机 c 代码)。我在 Studio 中重建应用程序,并在我的模拟器上重建 运行,并注意到我的修改没有发生。

我不会更改我的本机源,也不会更改本机和我的共享库之间的 api。

如果我使用 ndk-build 脚本重建本机,并将新的本机 ndk1 拖入,一切都会再次运行,包括新的修改。似乎我每次调整共享库时都需要通过 ndk 重建源...??

有什么想法吗?

更新: 我用 RE 工具打开了我的 libndk .so 库。结果是 ndk 编译器将 libmathadd 代码静态添加到 libndk 中,尽管它被列为本地共享库。我很好奇这是否是因为优化默认设置为最快速度,而 libmathadd 代码是简单的数学。

所以 libndk1.so 依赖于 libmath.so ?当您接触到 libmath 源时,重建它是合乎逻辑的。