通过ndk-build

时间:2015-12-02 13:06:10

标签: android c++ android-ndk static-libraries crypto++

这里我试图通过ndk-build构建libcryptopp.a,但是我收到错误,如下所示。

Android.mk

enter image description here

Application.mk

enter image description here

setenv-android.sh使用cryptopp 5.6.3创建libcryptopp.a和.so时

enter image description here

终端产生错误,如下所示

  

$ / Users / kasbahapple / Documents / AndroidDocs / AndroidADT / adt-bundle-mac-x86_64-20140702 / sdk / ndk-bundle / ndk-build

     

[armeabi] Gdbserver:[arm-linux-androideabi-4.8] libs / armeabi / gdbserver

     

[armeabi] Gdbsetup:libs / armeabi / gdb.setup

     

[armeabi-v7a] Gdbserver:[arm-linux-androideabi-4.8] libs / armeabi-v7a / gdbserver

     

[armeabi-v7a] Gdbsetup:libs / armeabi-v7a / gdb.setup

     

[x86] Gdbserver:[x86-4.8] libs / x86 / gdbserver

     

[x86] Gdbsetup:libs / x86 / gdb.setup

     

[armeabi]可执行文件:source_file

     

/Users/kasbahapple/Documents/AndroidDocs/AndroidADT/adt-bundle-mac-x86_64-20140702/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/ .. /lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld:错误:jni / nativelib / libcryptopp.a:无归档符号表(运行ranlib)

     

/Users/kasbahapple/Documents/AndroidDocs/AndroidADT/adt-bundle-mac-x86_64-20140702/sdk/ndk-bundle/platforms/android-8/arch-arm/usr/lib/crtbegin_dynamic.o:crtbrand。 c:function _start:error:对'main'的未定义引用

     

collect2:错误:ld返回1退出状态

我真的很难通过NDK构建c ++静态库。

我正在寻找解决方案。如果我做错了,请给我一个完整的步骤。

1 个答案:

答案 0 :(得分:2)

  

通过ndk-build构建libcryptopp.a时没有归档符号表(运行ranlib)

通过 Android.mk 构建Crypto ++库后,您需要在ranlib上运行libcryptopp.a。不幸的是,我不知道how to tell Android.mk to run ranlib

我猜测 - 这纯粹是猜测 - 你必须在Android.mk中分两步完成。你不能切入追逐并直接从源构建共享对象。

  • 构建libcryptopp.a,正在运行ranlib
  • libcryptopp.so
  • 构建libcryptopp.a
  

setenv-android.sh使用cryptopp 5.6.3 创建libcryptopp.a和.so时   ...
   APP_STL = gnustl_static

脚本setenv-android.sh使用STLport是因为GNU许可保留。您的Android.mk使用GNU的STL。

您可能也应该使用相同的C ++运行时库。此外,所有库必须使用相同的运行时。这意味着OpenGL,Crypto ++,[Favorite library]必须使用相同的C ++运行时,并且没有混合和匹配。此外,由于多个库正在使用C ++运行时,因此必须使用共享对象,而不是静态版本。

在NDK的某个地方讨论它的自述文件。我认为它叫做CPP-README或类似的。

此外,当您调用setenv-android.sh时, 必须 包含一个前导点。然后运行GNUmakefile-cross

. ./setenv-android.sh
make -f GNUmakefile-cross static dynamic cryptest.exe

最后,请不要发布图片。我几乎看不懂它们,因为我的眼睛已经老了。通常,安抚一个用户并不重要。在这种情况下,我是那个编写脚本和wiki页面的人,所以你想让我很容易,而不是对我很难:)