我正在尝试通过JNI加载两个库:
当我在Swift库上调用System.loadLibrary及其所有依赖项时,它们都可以正常加载。一旦我运行System.loadLibrary("LocalCLibrary")
- 无论是在加载其他人之后,还是根本没有在其他人上运行loadLibrary - 当尝试解析内部依赖关系到Swift库时,应用程序崩溃了。崩溃堆栈跟踪发送了一个非常令人困惑的消息:
dlopen failed: library "/Users/ephemer/AndroidTest/app/src/main/obj/local/armeabi-v7a/libSwiftTest.so" not found
我很困惑(而且很沮丧......)的原因是这条路径显然在我的本地开发机器上,而不是在Android设备上。所以我想我必须错误地链接这两个库。
这就是我目前链接库的方式..我的Android.mk看起来像这样:
LOCAL_PATH := $(call my-dir)
### A bunch of dependencies omitted here ###
# The Swift library:
include $(CLEAR_VARS)
LOCAL_MODULE := SwiftTest
LOCAL_SRC_FILES := libSwiftTest.so
include $(PREBUILT_SHARED_LIBRARY)
# The local C(++) library:
include $(CLEAR_VARS)
LOCAL_MODULE := LocalCLibrary
LOCAL_SRC_FILES := \
file1.cpp \
$(ANOTHER_PATH)/file2.cpp
LOCAL_C_INCLUDES += $(ANOTHER_PATH)
LOCAL_LDLIBS := -lSystem -lLibraries -lHere
LOCAL_STATIC_LIBRARIES := localDependency
LOCAL_SHARED_LIBRARIES := SwiftTest
LOCAL_CFLAGS = -O3
include $(BUILD_SHARED_LIBRARY)
C ++代码看起来像这样(当然简化):
void Java_com_test_androidtest_MainActivity_nativeFunc(JNIEnv *env, jobject self) {
// Do stuff here that depends on other C library code...
SwiftLibrary_callback(param1, param2); // do more processing
}
C ++标头还包括Swift Library的标题,它定义了
extern void SwiftLibrary_callback(type param1, type param2);
我想知道如果我能以某种方式在链接时删除库依赖关系并且以某种方式让它在加载时找到正确的符号,链接问题是否会消失:Swift库实际上自然加载,只有当依赖于库时在它上面试图加载所有东西。
非常感谢任何帮助!