当前位置:   article > 正文

Android NDK 交叉编译_termux安装android sdk交叉编译

termux安装android sdk交叉编译

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
  • 1
  • 2
#解压
unzip android-ndk-r17c-linux-x86_64.zip
  • 1
  • 2
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------------------------------------------------------------------------------------------------------------------------

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
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--------------------------------------------------------------------------------------------------------------------------

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

总结在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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
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
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

在build.gradle增加v7配置

     externalNativeBuild { //编译使用
            cmake {
//                cppFlags ''  //默认包含4个平台
                abiFilters "armeabi-v7a"
            }
        }

        ndk { //最终打到apk的库文件
            abiFilters "armeabi-v7a"
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后通过JNI编写方法调用就行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/573155
推荐阅读
相关标签
  

闽ICP备14008679号