Android / Swift JNI UnsatisfiedLinkError System.loadLibrary查找错误的路径

时间:2015-12-22 16:48:37

标签: java android linker java-native-interface dynamic-linking

我正在尝试通过JNI加载两个库:

  1. 与自己的Swift代码交互的自包含Swift库
  2. 主要与其他C代码交互的C库,除了上面一次调用Swift库之外。
  3. 当我在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库实际上自然加载,只有当依赖于库时在它上面试图加载所有东西。

    非常感谢任何帮助!

0 个答案:

没有答案