赞
踩
NDK官网
https://developer.android.google.cn/ndk/downloads/older_releases
NDK Linux 64 版本 r17c
https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh-cn
#重命名
mv android-ndk-r17c-linux-x86_64.zip\?hl\=zh-cn android-ndk-r17c-linux-x86_64.zip
#解压
unzip android-ndk-r17c-linux-x86_64.zip
touch main.c gedit main.c #输入 #include<stdio.h> int main(){ printf("success from c"); return 0; } #查看编辑内容 cat main.c #编译c文件 生成可执行文件 EXE gcc main.c -o EXE #执行可执行文件 在linux可执行 ./EXE #将EXE push到手机 由于真机在没有root权限的情况下,无法分配执行权限,所以无法执行 adb push EXE /sdcard #添加权限 chmod u+x EXE ./EXE #./EXE: not executable: 64-bit ELF file【非交叉编译的 执行文件,不能在安卓文件系统中运行】 直接使用gcc编译的可执行文件 不能在手机文件系统直接执行 #查看文件属性 file EXE #输出--------------------------------------------------------------------------------------------------------------------------- EXE: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=52b3a0b15b8763fb207092a64a3b4b4269e1d84e, for GNU/Linux 3.2.0, not stripped #输出end------------------------------------------------------------------------------------------------------------------------
#查看手机 CPU架构: adb -s 8B8Y0V8QU shell cat /proc/cpuinfo #想编译android可执行的文件 需要使用ndk里边的gcc /home/ms/tools/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc #临时环境变量 export NDK_GCC="/home/ms/tools/ndk/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc" #使用NDK_GCC编译 $NDK_GCC main.c -o NDKEXE #报错信息start-------------------------------------------------------------------------------------------------------------------- main.c:1:18: fatal error: stdio.h: No such file or directory include<stdio.h> ^ compilation terminated. #报错信息end---------------------------------------------------------------------------------------------------------------------- # 找不到头文件stdio.h 找不到头文件 库估计也找不到 #so 库路径 /home/ms/tools/ndk/android-ndk-r17c/platforms/android-21/arch-arm #头文件路径 /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include export NDK_PATH="--sysroot=/home/ms/tools/ndk/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include" #继续构建可执行文件 $NDK_GCC $NDK_PATH main.c -o NDKEXE #报错信息 start------------------------------------------------------------------------------------------------------------------- In file included from /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include/sys/types.h:36:0, from /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include/stdio.h:42, from main.c:1: /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include/linux/types.h:21:23: fatal error: asm/types.h: No such file or directory #include <asm/types.h> ^ compilation terminated. #报错信息结束 end----------------------------------------------------------------------------------------------------------------- # <asm/types.h> 找不到 接下来搞定asm #asm 路径 /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi export NDK_PATH="--sysroot=/home/ms/tools/ndk/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include -isystem /home/ms/tools/ndk/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi" #继续构建可执行文件 $NDK_GCC $NDK_PATH -pie main.c -o NDKEXE #生成了可执行文件 NDKEXE #查看文件类型属性 file NDKEXE #输出---------------------------------------------------------------------------------------------------------------------------- NDKEXE: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, not stripped #输出end--------------------------------------------------------------------------------------------------------------------------
总结在linux 编译android可执行的文件:
$【NDK_GCC地址】 --system $【库文件地址】 -system $【头文件地址】 -system $【asm地址】 -pie xx.c -o NDKEXE
#配置环境变量------------------------------------------------------------------------------------------------------------------ # NDK平台的支持 export NDK="/home/ms/tools/ndk/android-ndk-r17c/" #Linux环境变量 export PATH=$NDK:$PATH # 四大平台gcc export NDK_GCC_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc" export NDK_GCC_x64="$NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc" export NDK_GCC_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc" export NDK_GCC_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc" # --system $【库文件地址】 -system $【头文件地址】 -system $【asm地址】 export NDK_CFIG_x86="--sysroot=$NDK/platforms/android-21/arch-x86 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/i686-linux-android" export NDK_CFIG_x64="--sysroot=$NDK/platforms/android-21/arch-x86_64 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/x86_64-linux-android" export NDK_CFIG_arm="--sysroot=$NDK/platforms/android-21/arch-arm -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi" export NDK_CFIG_arm_64="--isysroot=$NDK/platforms/android-21/arch-arm64 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/aarch64-linux-android" #编译 动态 静态库 export NDK_AR_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar" export NDK_AR_x64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar" export NDK_AR_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar" export NDK_AR_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar" #配置环境变量end------------------------------------------------------------------------------------------------------------------ #编译头文件 编译c文件 action.h ----------------------------------------- #include<stdio.h> int doAction(); ----------------------------------------- action.c -------------------------------------------------- #include "action.h" int doAction(){ return 007; } ------------------------------------------------- #编译linux 可用的so动态库 gcc -fPIC -shared action.c -o libaction.so #查看file属性 file libaction.so ----------------------------------------------------- libaction.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=3b78888b5f68f6d7759c83373711b1bbfe8d7344, not stripped ---------------------------------------------------- #使用交叉编译工具编译手机可用的 so动态库 $NDK_GCC_arm $NDK_CFIG_arm -fPIC -shared action.c -o libactionndk.so #查看file属性 file libactionndk.so -------------------------------------------------------- libactionndk.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, not stripped ------------------------------------------------------------------------------------------- #编译linux 可用的静态库 gcc -fPIC -c action.c -o action.o ar rcs -o libaction.a action.o #编译手机可用的静态库 $NDK_GCC_arm $NDK_CFIG_arm -fPIC -c action.c -o actionndk.o $NDK_AR_arm rcs -o libactionndk.a actionndk.o
在前面生成了libactionndk.a 静态库和 libactionndk.so动态库
配置CMakeLists.txt
cmake_minimum_required(VERSION 3.10.2) project("ndkcollection") #批量导入cpp file(GLOB appCPP *.cpp) #引入静态库 #add_library(actionndk STATIC IMPORTED) #set_target_properties(actionndk PROPERTIES IMPORTED_LOCATION # ${CMAKE_SOURCE_DIR}/libactionndk.a) #引入动态库 add_library(actionndk SHARED IMPORTED) # 导入 set_target_properties(actionndk PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libactionndk.so) add_library( native-lib SHARED ${appCPP} ) find_library( log-lib log ) target_link_libraries( # 如果是动态库在运行期间libnative-lib.so 去加载我们的libactionndk.so native-lib ${log-lib} #actionndk # 链接此静态库到库libnative-lib.so )
在build.gradle增加v7配置
externalNativeBuild { //编译使用
cmake {
// cppFlags '' //默认包含4个平台
abiFilters "armeabi-v7a"
}
}
ndk { //最终打到apk的库文件
abiFilters "armeabi-v7a"
}
然后通过JNI编写方法调用就行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。