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

时间:2011-05-18 08:35:22

标签: android shared

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

我有共享库 libDsmTestLib.so ,它使用另一个共享库 libDsmShared.so libPINDsmShared.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)

当我创建 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);
        }
    }  
}

在catch块中我收到错误

  

无法加载库:link_image [1962]:   33无法加载所需的库   'libDsmShared.so'代表   'libDsmTestLib.so'   (load_library [1104]:图书馆   'libDsmShared.so'未找到)

Loadlibrary函数无法找到使用我的主库 libDsmTestLib.so 的库 libDsmShared.so ,谁能说出原因?我该怎么做才能解决这个问题?


其他信息

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

7 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

我有同样的错误。这就是我解决它的方法,也许你应该尝试这种方法。

LOCAL_LDLIBS += -L$(LOCAL_PATH)/libs/libutils.so

答案 2 :(得分:2)

应该是:

LOCAL_LDLIBS += -L$(LOCAL_PATH)/libs/
LOCAL_LDLIBS += -lutils

另请不要忘记将libutils.so复制到libs/armeabi文件夹

答案 3 :(得分:1)

不,Android VM会在自己的文件系统中搜索so文件,但不会搜索[C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib]文件夹(我认为)。

它将从@androidvm:/system或java.library.path指定的其他文件夹中搜索它。

答案 4 :(得分:1)

仅供参考,我在经过长时间的调试会议后发现,加载lib的顺序很重要。

    System.loadLibrary("libDsmShared");
    System.loadLibrary("libPINDsmShared");
    System.loadLibrary("DsmTestLib");

答案 5 :(得分:-1)

  1. 首先,您的Activity必须加载所有共享库

    static {
        try {
            System.loadLibrary("libDsmShared");
            System.loadLibrary("libPINDsmShared");
            System.loadLibrary("DsmTestLib");
        }
        catch( UnsatisfiedLinkError e ) {
            System.err.println("Native code library failed to load.\n" + e);
        }
    }
    
  2. 编译本机代码时包含“lib * .so”(在Android.mk中),如

    ...
    LOCAL_LDLIBS := -L/cygdrive/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared -lDsmShared
    LOCAL_LDLIBS += -L/cygdrive/home/android-ndk-r5b/samples/testingDsm/lib/libPINDsmShared -lPINDsmShared
    ...
    

答案 6 :(得分:-3)

I found this and test it

Android动态链接器有一个阻止它工作的错误, 但 我相信是固定在1.6。 如果使用NDK,请使用“LOCAL_SHARED_LIBRARIES:= libB libC” 确定 libA模块。 这假设libB和libC也是生成的NDK模块 与NDK。

In case libB.so and libC.so are not generated with the NDK, you should do
the following:
    在libA模块定义中
  • ,使用LOCAL_LDLIBS + = /full/path/to/libB.so /full/path/to/libC.so 这可确保在libA.so

  • 中生成正确的符号导出
  • 手动将libB.so和libC.so复制到$ APP_PROJECT / libs / armeabi 之前 重建你的.apk, 这确保它将被复制到/ data / data // lib at 包管理器的安装时间。

现在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)

但现在错误

  

无法加载库:link_image [1962]:   33无法加载所需的库   'C:/cygwin/home/android-ndk-r5b/samples/testingDsm/lib/libDsmShared.so'   为'libDsmTestLib.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这条路径时,我发现那里的库存在......什么是metter?