Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NDK无法加载libc++_共享。因此,获取;找不到符号';兰特';参考_Android_Android Ndk - Fatal编程技术网

Android NDK无法加载libc++_共享。因此,获取;找不到符号';兰特';参考

Android NDK无法加载libc++_共享。因此,获取;找不到符号';兰特';参考,android,android-ndk,Android,Android Ndk,在我的java类中,我有: static { System.loadLibrary("c++_shared"); System.loadLibrary("com.testandroid.LibAndroidBridge"); } 我的Application.mk有以下内容: NDK_TOOLCHAIN_VERSION:=4.8 APP_STL := c++_shared APP_ABI := x86 一切都很好,但当我运行应用程序(在模拟器或设备上,所以是x85和arm)时

在我的java类中,我有:

static
{
    System.loadLibrary("c++_shared");

    System.loadLibrary("com.testandroid.LibAndroidBridge");
}
我的Application.mk有以下内容:

NDK_TOOLCHAIN_VERSION:=4.8
APP_STL := c++_shared
APP_ABI := x86
一切都很好,但当我运行应用程序(在模拟器或设备上,所以是x85和arm)时,我在LogCat中得到了以下信息:

02-13 12:00:32.174: D/dalvikvm(2142): Trying to load lib /data/app-lib/com.testandroid-1/libc++_shared.so 0xb0fcfc60
02-13 12:00:32.174: D/dalvikvm(2142): Added shared lib /data/app-lib/com.testandroid-1/libc++_shared.so 0xb0fcfc60
02-13 12:00:32.174: D/dalvikvm(2142): No JNI_OnLoad found in /data/app-lib/com.testandroid-1/libc++_shared.so 0xb0fcfc60, skipping init
02-13 12:00:32.174: D/dalvikvm(2142): Trying to load lib /data/app-lib/com.testandroid-1/libcom.testandroid.LibAndroidBridge.so 0xb0fcfc60
02-13 12:00:32.174: E/dalvikvm(2142): dlopen("/data/app-lib/com.testandroid-1/libcom.testandroid.LibAndroidBridge.so") failed: dlopen failed: cannot locate symbol "rand" referenced by "libcom.testandroid.LibAndroidBridge.so"...
02-13 12:00:32.174: W/dalvikvm(2142): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/testandroid/AriesLib;
02-13 12:00:32.174: D/AndroidRuntime(2142): Shutting down VM
02-13 12:00:32.174: W/dalvikvm(2142): threadid=1: thread exiting with uncaught exception (group=0xb0cb0b20)
02-13 12:00:32.174: E/AndroidRuntime(2142): FATAL EXCEPTION: main
02-13 12:00:32.174: E/AndroidRuntime(2142): Process: com.testandroid, PID: 2142
02-13 12:00:32.174: E/AndroidRuntime(2142): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "rand" referenced by "libcom.testandroid.LibAndroidBridge.so"...
02-13 12:00:32.174: E/AndroidRuntime(2142):     at java.lang.Runtime.loadLibrary(Runtime.java:364)

有人知道为什么无法导入c++_shared.so库吗?

问题完全在本机方面。Java对JNI边界之外发生的事情没有任何线索。您不能让两个本机库以这种方式运行。特别是C++标准库(JNI没有任何符号容易、可靠地访问)。

您应该解析本地的所有符号,即您应该正确地将C++标准库链接到您的代码> LBCOM.TESTALIDRO.LIBONRORIDBIGHOR.SO ./P> 我建议不要在Android上混合使用{gcc toolchain(你的例子中是4.8)+libc++(“c++_共享”)}或{clang+libstdc++}。从理论上讲,它应该可以在桌面Linux或OSX上运行,但在Android上仍然存在可移植性问题和一些怪癖,这取决于NDK版本、目标和一些“随机”因素。所以它并不总是有效的

不幸的是,您没有在使用
rand
的地方提供代码(可能它甚至是非标准库
rand
,但有一些自定义代码?),但您仍然可以尝试:

  • 使用GCC的GNU标准库,将GCC4.8保留为工具链

  • 使用Clang编译器,将libc++保留为标准库
和/或

  • 为了“调试目的”使用静态链接(在缺少某些内容之前,它不会链接,这样您就可以在不干扰Java和JNI的情况下找到原因)

真正的错误是:由于Android-21不兼容,rand()不存在

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "rand" referenced by
有关更多信息,请参见此

建议的修复方法是在jni/Application.mk中降级API,并将其设置为低于Android-21的
如果你需要Android-21,谷歌实际上建议你提供多个APK文件。啊。

你不必写

System.loadLibrary("c++_shared");
只包括:

APP_STL := c++_shared 
在Application.mk中
这应该可以让它工作,现在libc++u共享了。所以将被捆绑

为什么要这样做
System.loadLibrary(“c++u共享”)?C++标准库是用C++编写的,几乎没有包含JNI访问的任何符号。你的确切目标是什么?我的理解是为了强制这个库加载C++,我需要把它作为一个库加载到java代码中。最终的目标是去掉丢失的“Rand”符号4.4.2。我现在没有在Java中导入c++\U共享库,我已经注释掉了NDK\U工具链的版本:=4.8。计划是使用llvm编译,或者尽可能接近llvm。根据文档c++共享的是LLVM,对吗?rand是一个称为rand()的函数;在C++代码中,它来自STDLIB .h作为int RAND(空格);通过这些更改,我仍然得到dlopen(“/data/app lib/com.testandroid-1/libcom.testandroid.LibAndroidBridge.so”)失败:dlopen失败:找不到由“libcom.testandroid.LibAndroidBridge.so”引用的符号“rand”…是的,libc++是LLVM项目的一部分,与Clang编译器相同。删除
NDK\u工具链版本:=4.8
不会改变任何内容。NDK默认使用GCC(使用的版本取决于NDK版本)。要使用clang编译lib,请使用
NDK\u工具链版本:=clang
。如果没有帮助,请尝试我答案中的第三点。在所有情况下,在重建之前以及最终APK之前,请仔细检查是否正确清理了所有旧二进制文件(*.o,*.so,*.a)。使用详细的生成输出(
-V
选项)来验证您的项目是否使用所需的工具链和库生成。使用clang的问题是,我在几个.c文件上遇到编译错误,而我在工具链4.8中没有遇到这些问题。我应该使用clang并尝试解决这些编译问题,还是应该保留4.8并尝试以其他方式解决这个rand()问题?让我们尝试另一件事:在
Application.mk
中设置
System.loadLibrary(“c++\U共享”)
在android版本<4.3上仍然需要这样做。