共享库可以调用另一个共享库吗?

Vik*_*yan 7 android shared

可以从另一个共享库中共享库加载和调用函数吗?

我有共享库libDsmTestLib.so,它使用另一个共享库libDsmShared.solibPINDsmShared.so

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE           := DsmTestLib
LOCAL_SRC_FILES        := DSM_Library.cpp

LOCAL_LDLIBS := -lDsmShared
LOCAL_LDLIBS += -lPINDsmShared

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

当我创建libDsmTestLib.so并想在我的android java应用程序中使用它时,如下所示:

package com.dsm;

import android.app.Activity;
import android.os.Bundle;

public class dsmTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    static {
        try {
            System.loadLibrary("DsmTestLib");
        }
        catch( UnsatisfiedLinkError e ) {
             System.err.println("Native code library failed to load.\n" + e);
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

在catch块中我得到错误

无法加载库:link_image [1962]:33无法为'libDsmTestLib.so'加载所需的库'libDsmShared.so'(load_library [1104]:找不到库'libDsmShared.so')

LoadLibrary函数无法找到库libDsmShared.so使用我的主库libDsmTestLib.so,谁能告诉为什么?我该怎么做才能解决这个问题?


附加信息

我有一个静态库(.so用C++编写),我想从我的Java android应用程序中使用它,因为我创建了.cpp和.h文件,我在其中调用了以前创建的库中的函数.

Vla*_*kin 7

我用这种方式找到了解决方案 - 明确加载库:

    static {
    try {
        System.loadLibrary("DsmShared");
        System.loadLibrary("DsmTestLib");
    }
    catch( UnsatisfiedLinkError e ) {
         System.err.println("Native code library failed to load.\n" + e);
    }
} 
Run Code Online (Sandbox Code Playgroud)


Vik*_*yan -3

我发现了这个并测试了它

Android 动态链接器有一个错误,导致其无法工作,但我相信在 1.6 中已修复。如果您使用 NDK,请在定义 libA 模块时使用“LOCAL_SHARED_LIBRARIES := libB libC”。这假设 libB 和 libC 也是使用 NDK 生成的 NDK 模块。

In case libB.so and libC.so are not generated with the NDK, you should do
the following:
Run Code Online (Sandbox Code Playgroud)
  • 在 libA 模块定义中,使用 LOCAL_LDLIBS += /full/path/to/libB.so /full/path/to/libC.so 这可确保在 libA.so 中生成正确的符号导出

  • 在重建 .apk 之前,手动将 libB.so 和 libC.so 复制到 $APP_PROJECT/libs/armeabi,这可确保包管理器在安装时将其复制到 /data/data//lib 。

现在 Android.mk 看起来是这样的:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE           := DsmTestLib
LOCAL_SRC_FILES        := DSM_Library.cpp


#LOCAL_SHARED_LIBRARIES := DsmShared
#LOCAL_SHARED_LIBRARIES += PINDsmShared


# Set local libs with full path.                                                                
LOCAL_LDLIBS := C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so           
LOCAL_LDLIBS += C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libPINDsmShared.so        

include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

但现在错误

无法加载库:link_image[1962]:33无法加载“libDsmTestLib.so”所需的库“C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so”(load_library[1104] : 库 'C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so' 未找到)

发生了,但是当我检查 C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so 这个路径时,我发现该库存在于那里......这是怎么回事?