android系统预编译so,【NDK】编译生成直接运行在Android系统的可执行文件

本文将演示如何编译生成直接运行在Android系统的可执行文件。

开发环境:Eclipse + NDK + CDT(脱离eclipse + cdt的编译在文末介绍)

1.在Eclipse的Java视图中,新建一个工程名为”Execute”

2.右击工程-> Android Tools -> Add Native Support…

在弹出的“Add Android Native Support”中填写“library name”为”Execute”。点击“确定”。

Eclipse会自动切换到”C/C++”视图,其工程目录下新增”jni”及”Execute.cpp”文件如下图。

0ac710c336248747478aeeca014f2e73.png

3.编写c++代码如下(实际代码其实是c代码,c++代码将会碰到一些编译问题将会在下文中介绍):

1

2

3

4

5

6#include

int main(){

printf("Hello world.\n");

return 0;

}

4.编写Android.mk如下:

1

2

3

4

5

6

7

8LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := Execute

LOCAL_SRC_FILES := Execute.cpp

# BUILD_EXECUTABLE指明生成可执行的二进制文件

include $(BUILD_EXECUTABLE)

5.右击工程 -> Build Project,可见直接在libs下生成二进制文件“Execute”

334ab510535b31faaed0e6b4fa4cc9a7.png

6.将该文件拷贝出,push到手机的/data/local下(在SDCard是不可运行的,文件系统的权限限制)

并执行“./execute”运行输出日志“Hello World”.见下图。

bbceb8f1526e9f4b99d29c8dfcbbdc0c.png

以上是生成一个可在Android系统中直接运行的可执行文件过程。

#C++编译问题补充

在示例代码中,如果想把c语言的实现改为c++,则步骤和碰到的问题如下:

1.使用c++代码详情如下:

1

2

3

4

5

6#include

using namespace std;

int main(){

cout << "Hello World" << endl;

return 0;

}

2.执行”Build Project”后,会出现“fatal error: iostream: No such file or directory”问题。见下图。

725a6436ea8a719f8e13c9ca79643ec4.png

解决:在jni文件夹下新建Application.mk文件,并在其中写入:

1

2

3#以下两行二选一

APP_STL:=stlport_static

#APP_STL:=gnustl_static

继续编译,则正常。

原因:

在使用C++的标准库进行NDK开发时,必须设置APP_STL,该属性值的可取范围见下图:

102eb59b56d4a0c463b690bbcc540baf.png

上图中不同的标准库的能力也各有差异,见下表。

C++ C++ Standard

Exceptions RTTI Library

system no no no

gabi++ no yes no

stlport no yes yes

gnustl yes yes yes

要特别注意的是,引用的类库越全面,最后生成的可执行文件execute体积也就越大。以下是使用c语言、c++ stlport及c++ gnustl三种情形所编译生成的可执行文件体积对比:

2b331715f3e16e5dc4fd5be342e29714.png

#直接使用ndk-build编译

还记得在linux上只要执行gcc/g++就可以直接生成一个可执行文件吗?

在进行ndk开发时,也可以脱离eclipse+cdt,只用命令ndk-build来编译。

进入Execute工程目录下,建立了jni文件夹后,编写好Execute.cpp及Android.mk文件,在Terminal终端命令工具下进入Execute目录,直接执行ndk-build,即可!!so easy..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值