一个共享库可以从另一个共享库加载和调用函数吗?
我有共享库 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文件,我从之前创建的库中调用了该函数。
答案 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)
首先,您的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);
}
}
编译本机代码时包含“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)
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:
,使用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 包管理器的安装时间。
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?