1.NDK下载
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
2.GCC 编译可执行文件
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------------------------------------------------------------------------------------------------------------------------
3.编译Android手机可以执行的可执行文件
#查看手机 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
4.编译动态库或者静态库
#配置环境变量------------------------------------------------------------------------------------------------------------------
# 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
5.集成生成的动态库和静态库
在前面生成了libactionndk.a 静态库和 libactionndk.so动态库
- 将动态库放置到jniLibs/armeabi-v7a/libactionndk.so下面
- 将静态库放置到src/main/cpp/libactionndk.a 下面
配置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编写方法调用就行