正确的构建过程相对容易,我的问题是使 libmod1.so 依赖于 libmod2.so 在启动时导致不满意的链接 - mod1 代码找不到 mod2 共享库,即使两者都存在于同一个文件夹中最终的 APK,在 libs/armeabi、libs/x86 等下。但是,为了使我的答案完整:
NDK_TOOLCHAIN_VERSION=4.7
APP_PLATFORM := android-8
APP_ABI := armeabi armeabi-v7a x86
LOCAL_PATH := $(调用我的目录)
包括 $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := mod2 # 这使得 libmod1.so 依赖于 libmod2.so
LOCAL_MODULE := mod1
LOCAL_SRC_FILES := mod1/file1.c
LOCAL_SRC_FILES += mod1/file2.cpp
...
include $(BUILD_SHARED_LIBRARY) # 这实际上构建了 libmod1.so
包括 $(CLEAR_VARS)
LOCAL_MODULE := mod2
LOCAL_SRC_FILES := mod2/file1.cc
LOCAL_SRC_FILES += mod2/file2.cc
...
include $(BUILD_SHARED_LIBRARY) # 这会构建 libmod2.so
就是这样,所有构建都没有抱怨 ndkbuild 脚本。您只需要一个 C 包装器就可以从 Java 调用一些函数。这是我的问题。因为我只有在 libmod1.so 中有可从 Java 调用的函数,所以我在 Java 中的 C 包装类就像:
public class CWrapper {
static {
System.loadLibrary("mod1");
}
public static native int func1(String aParam);
...
}
这对我来说似乎很合乎逻辑 - 我从 Java 调用 libmod1.so,所以我使用了 System.loadLibrary("mod1"),因为 libmod1.so 知道它依赖于 libmod2.so,并且两个文件都在同一个文件夹,libmod1 会知道如何查找和加载 libmod2,对吧?错误的!它在应用程序启动时因“不满意的链接”而崩溃。确切的错误信息是:
java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libmod2.so" needed by "libmod1.so"; caused by load_library(linker.cpp:745): library "libmod2.so" not found
我到处寻找更多代码以添加到 Android.mk 以解决这个问题,但徒劳无功。终于尤里卡了!我修改了我的 CWrapper 类如下:
public class CWrapper {
static {
System.loadLibrary("mod2"); // must be first, as mod1 depends on mod2!
System.loadLibrary("mod1");
}
public static native int func1(String aParam);
...
}
事情开始变得像魅力一样......
格雷格