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 源时,重建它是合乎逻辑的。
我有一个问题,为什么我不能简单地在 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 源时,重建它是合乎逻辑的。