Android-ARM进阶
学习一些关于ARM的汇编结构特点,以及分析。理解一些结构最好的方法就是多去尝试动手做。。
NDK-Build的使用
可以参考官方文档。
创建一个Android项目
cd 项目目录
/ndk-build 。也可以将NDK-build加入环境变量。
创建jni文件夹,添加 Android.mk和 Application.mk两个文件。(参考官方文档)
1 2 3 4 5 6 7 8 9
//Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 要生成的.so库名称 LOCAL_MODULE := hello # c++文件 LOCAL_SRC_FILES := hello.cpp include $(BUILD_SHARED_LIBRARY)
1 2 3 4
//Application.mk APP_PLATFORM := android-17 # APP_ABI := all APP_ABI :=armeabi-v7a arm64-v8a
添加hello.cpp:
1 2 3 4 5 6 7 8 9 10 11 12
#include<cstdio> int i,j; int num[] = {1,2,3,4,5}; int main() { /* code */ printf("hello,world!\n"); for(i=0;i<5;i++){ printf("num value is %d\n",num[i]); } return 0; }
ndk-build
push 到Android设备运行
这里ARM32位出现里非法引用(Illegal instruction)。。之后再试试
改成ARM64之后又出现内存区段错误“Segmentation fault” 有毒呀。。可能是哪里设置有问题。。
arm-linux-gcc交叉编译器编译
arm-linux-gcc也能编译出ARM可执行文件。sudo apt install g++-arm-linux-gnueabihf
或者下载二进制文件安装。
arm-linux-gnueabihf-g++ -static helloworld.cpp
push进Android之后运行成功
使用这个方法和用NDK-build编译的有差异。
for循环
待添加
if-else
待添加
while
switch
优化
###C++
JNI API分析
//Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
# 要生成的.so库名称
LOCAL_MODULE := hello
# c++文件
LOCAL_SRC_FILES := hello.cpp include $(BUILD_SHARED_LIBRARY)