java - 使用 System.loadLibrary 调用加载共享库永远不会返回

标签 java android android-ndk java-native-interface loadlibrary

我在使用 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/

相关文章:

java - 即使有退出条件,欧几里得树对象堆栈溢出错误

android - 如何在多点触控上缩放整个 Activity ?

java - 首次 Scala 构建后 Eclipse 无法运行

java - 如何修复 onActivityResult 之后 JNI 代码内的 Android 崩溃?

android - 崩溃 : Thread SIGBUS 0x0000000054f1f000

java - GWT 和 AppEngine 中的 Google Oauth2

Java Socket程序从服务器读回

java - 如何手动添加依赖到Android Studio

java - JNI 和 Android...UnsatisfiedLinkError

c++ - 如何释放从 native 代码发送回 Java 的 jstring?