我在使用 System.loadLibrary("my_shared_lib");
加载 native 库时遇到问题
问题是这个调用永远不会返回。
上下文如下:
在我的项目中,我有几个使用 nkd-build 脚本构建的静态库。
使用这个 Android.mk
构建它们效果很好对于每个 .a
我需要的库:
**Android.mk used for static libs**
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_static_lib_1
# Include paths
LOCAL_C_INCLUDES := \
$(PATH_TO_INCLUDES1) \
$(PATH_TO_INCLUDES2)
# Sources
LOCAL_SRC_FILES := \
my_source_1.cpp\
my_source_11.cpp
# Target
include $(BUILD_STATIC_LIBRARY)
这些静态库当然只包含 native (C++) 源代码,以及一些 JNI 包装器(可从 Java 源代码调用)。
一旦构建了所有静态库( .a
),我想构建一个包含所有 .so
的共享库( .a
)我需要的库。
这是Android.mk
我正在用来构建这个共享库:
LOCAL_PATH := $(call my-dir)
#----------
# Static prebuilt libs
#----------
#-- my_static_lib_1
include $(CLEAR_VARS)
LOCAL_MODULE := my_static_lib_1
LOCAL_SRC_FILES := $(PATH_TO_LIBS)/my_static_lib_1.a
include $(PREBUILT_STATIC_LIBRARY)
#-- my_static_lib_2
include $(CLEAR_VARS)
LOCAL_MODULE := my_static_lib_2
LOCAL_SRC_FILES := $(PATH_TO_LIBS)/my_static_lib_2.a
include $(PREBUILT_STATIC_LIBRARY)
#----------
# Building shared lib
#----------
include $(CLEAR_VARS)
LOCAL_MODULE := my_shared_lib
#-- Some of the .a static libs need these libs
LOCAL_LDLIBS := \
-lz\
-llog \
$(PATH_TO_NDK_LIBS)\libstlport_static.a
#-- This variable is used to force libs to be included in the .so
LOCAL_WHOLE_STATIC_LIBRARIES := \
my_static_lib_1\
my_static_lib_2
include $(BUILD_SHARED_LIBRARY)
这为我打造了一个完美的 .so
文件,包含 .a
中的所有函数libs(我可以在生成的 .so
lib 上使用 nm 命令进行检查)。
为了完整起见,这里是 .java
文件动态加载.so
库:
public class MyClass
{
static {
Log.d("MYLOGS", "Loading...");
System.loadLibrary("my_shared_lib");
Log.d("MYLOGS", "Loaded.");
}
...
}
问题:
当我创建 MyClass 的新实例时,会调用 loadLibrary,但它永远不会返回。我可以看到Loading...
记录但从未记录 Loaded.
一。
logCat 说 Trying to load lib [...].so
但仅此而已,应用程序卡住了。
当我只有一个静态库 .a
时,所有这些都可以正常工作。在我的.so
文件。这样的话我就可以完美调用我的原生代码了。但我的项目使用8 .a
文件,并且我得到了一个卡住的应用程序,因为在这种情况下 loadLibrary 永远不会结束。
loadLibrary
有什么问题吗?称呼 ?你有什么想法吗?
谢谢。
最佳答案
我发现我的代码出了什么问题。
实际上,当 loadLibrary 加载 .so
库时,它会创建 .so
中声明的所有全局变量/常量,当然包括每个 的每个全局变量/常量>.a
lib 包含在 .so
中。
其中一些全局是通过执行一些代码的构造函数构建的。
我发现在我的 .a
libs 架构中,这段代码在某些时候陷入了僵局,因为它被调用得太早(一些需要的东西还不存在)。我没想到它会在 loadLibrary
时间被调用。
因此,如果这可以帮助任何人:请记住,loadLibrary
涉及创建您尝试加载的 .so
库中包含的所有全局对象。
不知道这是我的错误。
关于java - 使用 System.loadLibrary 调用加载共享库永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21915274/