c 编写android程序,利用Android Studio编写 Android上的c与c++程序

Android Studio 2.3.1

FrankNote: Android 3.1.2

1.       新建New Project:

a)

3f91116b6f68ec2387f58abe415546a8.png

b)

b0ff4671a53b8b35c100b9a0f9768eba.png

c)

f7b8d1f899c1f189b194b0a587d8d3f5.png

d)

fed1a94d87e943a6dd9de4e2559157fa.png

e)

c98f18ce565e546efa3c1607bc27fd21.png

2.       自动打开新建的工程:

a)         以project的方式显示工程:

08fb088a4a5a316df40c9aae8ff7c01d.png

b)         Main目录下新建jni文件夹:

FrankNote: 如果之前没有安装NDK, 自动下载NDK,  退出,重新打开Android Studio 就可以看到下图所示的项目

233df61e6a206755ce897fa715ab3a04.png

c)         jni文件夹下新建test_hello_world.cpp:

02ae47e23bee1a4c1c96dd47bc13970a.png

d)         jni文件夹下新建Android.mk:

FrankNote:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -pie -fPIE

LOCAL_LDFLAGS += -pie -fPIE

LOCAL_MODULE := test_hello_world

LOCAL_SRC_FILES =: test_hello_world.cpp

include $(BUILD_EXECUTABLE)

LOCAL_CFLAGS += -pie -fPIE

LOCAL_LDFLAGS += -pie -fPIE

原因 PIE这个安全机制从4.1引入,但是Android L之前的系统版本并不会去检验可执行文件是否基于PIE编译出的。因此不会报错。但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。解决办法非常简单,在Android.mk中加入如下flag就行。

FrankNote End

251912d09fe04fce00a35f48883dbc34.png

e)         jni文件夹下新建Application.mk文件,作用在于支持c++共享库:

FrankNote:

APP_STL := gnustl_static

原因:

原方案使用的是共享库,这不一定都支持所有的机型,改用静态库gnustl_static  问题解决。

https://blog.youkuaiyun.com/luozhuang/article/details/36418229

c7a9ad08d94d12aa05de920c0b1b0202.png

f)          注意观察project下的local.properties文件:

9115d5dfc64d094faa41ca65dd88f844.png

g)         修改project下的gradle.properties文件,增加配置android.useDeprecatedNdk=true,其作用在于告诉系统使用ndk编译:

67314b73087ab3654fdc34f828fac64a.png

h)         修改app目录下的build.gradle文件,增加配置:

i.              ndk的abiFilters配置作用在于限定生成的cpu/abi。

ii.              jni.srcDirs = [] 表示禁止as自动ndk编译,采用手动ndk-build。

iii.              jniLibs.srcDirs = [‘src/main/libs’]  表示经过ndk-build编译后的so路径。

5fa005260b4734ad1b71ae56614dd886.png

i)           jni文件夹下新建Cmd script,make_x86.cmd,用于手动ndk-build:

4ceda8a3d66b95222433158acfc817fb.png

j)           右键点击make_x86.cmd文件选择Run cmd script:

2ce80fb03e3e816f276d36ba255d1709.png

48abe9558f05870357f049d372a0aa93.png

k)         获得目标程序文件test_hello_world:

C:\Users\jacki\AppData\Local\Android\Sdk\ndk-bundle\ndk-build.cmd APP_ABI="x86"

4d420d607efefaa523b378ae6e9bc0e2.png

9d6328cdb7534e157fc6edc4b8742556.png

3.       在Android虚拟机中执行程序:

a)         开启x86 cpu/abi的虚拟机:

daf8e1a2b4572be496301604a08d241e.png

b)         使用adb命令把文件传到Android虚拟机中,并赋予可执行权限:

静态库没有.so文件

6ac460db315cd8ffac670cd97c471dac.png

c)         添加当前路径为so库文件查找路径命令,防止elf文件运行阶段找不到so库的问题,LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/tmp

fb9e41c104d6a89043befcc0f2567e04.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值