Android NDK 交叉编译

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编写方法调用就行

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值