2

我试图弄清楚如何设置一个Android.mk依赖于另一个。后者构建原生代码共享库,前者有依赖共享库的JNI库。我们称它们为shared_liband service

现在,Android.mkforservice包含如下代码:

LOCAL_SRC_FILES := ../../../shared_lib/libs/armeabi/libshared_NDK.so
include $(PREBUILT_SHARED_LIBRARY)

这有效,但前提shared_lib是已经建成。建设service不建设shared_lib

我编写了一个 shell 脚本,它首先构建shared_lib然后构建service. 但似乎应该可以使用构建系统来完成构建任务。

我尝试使用$(call import-module,...)但没有找到任何有效的语法。makefile 路径扩展中有如此多的魔力,以至于我永远无法预测会发生什么。例如,将此代码添加到 Android.mk 中service

include $(CLEAR_VARS)
SL_DIR=$(LOCAL_PATH)/../../../shared_lib
$(call import-add-path,$(SL_DIR))
NDK_MODULE_PATH := $(SL_DIR)
$(call import-module, jni)

这根本不起作用。我得到了这个错误结果:

/Users/steveha/devel/android/ndk/build/core/build-binary.mk:450: warning: overriding commands for target `obj/local/armeabi/libshared_NDK.so'
/Users/steveha/devel/android/ndk/build/core/build-binary.mk:473: warning: ignoring old commands for target `obj/local/armeabi/libshared_NDK.so'
/Users/steveha/devel/android/ndk/build/core/build-binary.mk:489: warning: overriding commands for target `libs/armeabi/libshared_NDK.so'
/Users/steveha/devel/android/ndk/build/core/build-binary.mk:489: warning: ignoring old commands for target `libs/armeabi/libshared_NDK.so'
make: *** No rule to make target `../../shared_library/jni/com_dts_SourceFile.cpp', needed by `obj/local/armeabi/objs/dts-shared-jni/com_dts_shared_SourceFile.o'.  Stop.

看起来像是import-add-path在弄乱变量,从而导致在错误的位置搜索 C++ 源文件。但是import-module没有它就失败了。

此外,如果您先运行,则在ndk-build clean目录中运行会service失败并出现错误。由于该文件被列为本地源文件,因此它不存在是错误的。ndk-build cleanshared_lib.so

ndk-build构建在 之上make,并且有一个单一的全局命名空间,而我为构建另一个make所做的一切尝试都遇到了这样的问题。最好的方法似乎是显式调用以获取一个新的实例,从而获得一个单独的命名空间。Android.mkAndroid.mkndk-buildmake

有什么方法可以设置,以便ndk-build首先service构建shared_lib?如果上述ndk-build clean情况也正常工作,则加分。

4

1 回答 1

0

我从来没有找到一个纯粹的“制造”解决方案。相反,我编写了一个 Python 脚本来依次构建每个模块。ndk-build在自己的进程中运行每个程序既简单又健壮。

于 2014-04-19T05:03:20.970 回答