如何在Android平台下编译带STL的C++程序

如何在Android平台下编译带STL的C++程序,第1张

1、下载最新的Android SDK,下载Android NDK R9C版本。

2、如是在windows平台下需要在PATH中设置环境变量,以便于直接调用NDK来编译C++程序

将如下两个路径加入到PATH中拿昌:<ANDROID_NDK><ANDROID_SDK>\platform-tools

其中<NDK>为你的计算机上Android NDK的安装路径,<SDK>为Android SDK的安装路径

如果在你的SDK下没有platform-tools目录,则在Eclipse中按照如下截图进行 *** 作:

3、为要编译的C++程序建一个文件夹蚂纳,如myproject。在myproject下再建一个jni文件夹,将源代码放在这个文件夹下,myproject/jni。

mkdir myproject

mkdir myproject/jni

4、在jni文件夹下建两个分别名为:android.mk和

application.mk文件。android.mk类以于C++程序的makefile,application.mk则指明当前程序依赖的库。

android.mk的示例为:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := my_first_app #指明C++程序编译出的可执行程序的名称

LOCAL_SRC_FILES:= my_first_app0.cpp \ #指明要编译的源文件,可以有很多个

my_first_app1.cpp\

include$(BUILD_EXECUTABLE)#表明编译的是可执行程序

/**************************************************************************/

application.mk的示例为:(在application.mk中指明STL库)

APP_STL:= gnustl_static

这里选STL库时有四个选项:

system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持

stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的

stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。

gnustl_static - 使用 GNU libstdc++ 作为静态库

默认情况下STLPORT是不支持C++异常处理和RTTI,所以不要出现 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static来支持标准C++的特性,但生成的文件体积会偏大,运行效率会低一些。

支持C++异常处理,在Application.mk中加入 LOCAL_CPPFLAGS +=

-fexceptions这句消物扒,同理支持RTTI,则加入LOCAL_CPPFLAGS +=

-frtti,这里再次提醒大家,第二条说的使用gnustl静态库,而不是stlport。

强制重新编译 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以强制重新编译STLPort源码,由于一些原因可能自己需要修改下STLPort库,一般普通的开发者无需使用此项

5、打开控制台(cmd),在myproject目录下用android的NDK build工具编译C++程序:

cd myproject

$NDK/ndk-build

如果程序没错的话,会编译出android的可执行程序,位置在myproject/libs/armeabi/my_first_app

8、将编译出来的my_first_app放到手机或是模拟器上运行。在windows的cmd上运行adb.exe。

用adb.exe将my_first_app程序push到手机或模拟器的/data/local目录上:

adb.exepush myproject\libs\armeabi\my_first_app /data/local。

9、通过adb,在手机上运行my_frist_app:

在cmd上运行:

adb.exe shell

由此进入到手机的linux终端上,接下来再更改my_first_app的权限使其可以运行:

cd /data/local

chmod 777 my_first_app

./my_first_app//如果没错的话,这一步即可运行my_first_app

至此在android上编译含STL的C++程序的过程结束。

其实android ndk上的编译说到底也就是交叉编译,只要配置好交叉编译工具链,使用原有的makefile也是可岩尺以编译出在android运行的c、c++程序的。以android-ndk-r4-crystax的ndk版本为例:编译器路径 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin名称前缀 arm-eabi-头文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include库粗旅高文件目录 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib你可以试一下上面的配置,如果编译链接都没有问题,可以adb push到android设备上运行看看,什么结果?有点崩溃,根本运行不起来,你也许想试试看android自带的ndk例子,确实是能够运行的,问题在哪儿呢?只是正确配置了编译器、头文件、库文件还不够,还需要配置编译、链接的参数,android例子中编译链接的参数是什么呢?你也许想深究一下android的makefile,可是不久你会发现那是更崩溃的事情,里面用了很多的make脚本函数。其实android的makefile是可以把执行的详细命令输出来的,只要make的时候加上V=1即可。可以看到镇蠢确实带了很多参数编译参数:-fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Wa,--noexecstack -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID 链接参数:-nostdlib -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--no-undefined -Wl,-z,noexecstack -L$(PLATFORM_LIBRARY_DIRECTORYS) crtbegin_static.o crtend_android.o 这其中链接参数中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最关键的,android使用了自己的进程加载器,并且自定义了c运行时的启动结束。难怪先前编译的进程启动不了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12440643.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存