Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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上的库生成错误_Android_Build_Crypto++ - Fatal编程技术网

Android上的库生成错误

Android上的库生成错误,android,build,crypto++,Android,Build,Crypto++,在两天多的建筑错误之后,我放弃了 我在这里遵循了这个很好的教程:。 它进行编译,“cryptest.exe”通过了所有测试。所以,我想静态库“libcryptopp.a”是可以的 因此,我移动了“libcryptopp.a”和Android项目中的所有头文件 但在构建步骤中(通常是…:-)会出现编译错误,如: .../Classes/libs/android/libcryptopp.a(files.o): in function std::basic_filebuf<char, s

在两天多的建筑错误之后,我放弃了

我在这里遵循了这个很好的教程:。 它进行编译,“cryptest.exe”通过了所有测试。所以,我想静态库“libcryptopp.a”是可以的

因此,我移动了“libcryptopp.a”和Android项目中的所有头文件

但在构建步骤中(通常是…:-)会出现编译错误,如:

    .../Classes/libs/android/libcryptopp.a(files.o): in function std::basic_filebuf<char, std::char_traits<char> >::_M_unshift() 
    [clone .part.40]:/Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/stlport/stlport/stl/_fstream.h:322: 
    error: undefined reference to 'std::_Filebuf_base::_M_write(char*, int)' 

    and ~50 others ... 
在尝试使用“APP\u STL:=stlport\u static/dynamic”、“APP\u STL:=gnustl\u static/dynamic”等之后。。。没有机会了

作为一名真正的建筑/编译专家(在Android上更糟),有人能帮我吗。 多谢各位

好的。它正在工作

因此,“libcryptopp.a”的链接在我的Android项目中不适用于“stlport”,而只适用于“gnustl_static”。也许是因为其他的原因,比如“cocosd2-x”

因此,在tuto“”之后,必须更改脚本“setenv android.sh”以获得如下结果:

    ANDROID_STL_INC: /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/
    ANDROID_STL_LIB: /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/libgnustl_static.a
并移动文件(仅用于编译)

否则就会出现编译问题


哎哟

我认为你的答案有几个问题

首先,当多个库使用标准运行时,必须使用共享对象版本,而不是静态版本。这在ANDROID\u NDK\u ROOT/docs/CPLUSPLUS-SUPPORT.html中有介绍

其次,您可能对库加载顺序有问题。静态链接使之消失,因为对
std::\u Filebuf\u base::\u M_write(char*,int)
(和friends)的引用在编译时解析,而不是在链接/加载时解析。要解决此问题,必须先加载
libstlport\u shared.so
(或
libgnustl\u shared.so
),然后再加载
libcryptopp.so

如果先加载libcryptopp.so,则进程中没有加载运行时来解析
std::_Filebuf_base::_M_write(char*,int)
(和friends)。wiki页面中包含了
LD_PRELOAD
技巧

要在Android Java中修复它,您需要执行以下操作。有关详细信息,请参阅

static {
    System.loadLibrary("stlport_shared");
    System.loadLibrary("cryptopp");
}

Crypto+++Andrid wiki页面已更新:。

是。它使用的是静态版本,但这不是正确的方法。谢谢你更新了维基。
    /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/include/bits 
    /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/bits
static {
    System.loadLibrary("stlport_shared");
    System.loadLibrary("cryptopp");
}