linux ndk编译搭建测试

article/2024/6/13 22:44:12

一、ndk下载

NDK 下载  |  Android NDK  |  Android Developers

二、ndk环境变量配置

ndk解压:

unzip android-ndk-r26d-linux.zip 

环境变量配置:

 export NDK_HOME=/rd/own/test/android-ndk-r26d/
 export PATH=$PATH:$NDK_HOME

三、编译测试验证

3.1 程序创建

创建helloworld, 在其下创建jni目录,并准备好hello.c和Android.mk

rd@ubuntu:~/test/android-ndk-r26d$ cat helloword/jni/hello.c
#include <stdio.h>
int main (int argc,char *argv[])
{printf("hello world!");return 0;
}
rd@ubuntu:~/test/android-ndk-r26d$ cat helloword/jni/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := helloworld
LOCAL_SRC_FILES := hello.c
#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)
编译库文件Android.mk参考:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := FRE
LOCAL_SRC_FILES := FlashRuntime.so
include $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := NativeQCAR
LOCAL_SRC_FILES := main.c
LOCAL_SHARED_LIBRARIES := FRE
include $(BUILD_SHARED_LIBRARY)

备注:如果不创建jni目录,会报NDK_PROJECT_PATH 找不到。

Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.

如果不创建jni目录,则需要添加额外的配置( NDK_PROJECT_PATH、NDK_APPLICATION_MK和APP_BUILD_SCRIP),如下:

ndk-build NDK_PROJECT_PATH=/rd/test/android-ndk-r26d/helloword  NDK_APPLICATION_MK=/rd/test/android-ndk-r26d/Application.mk
cat Application.mk
APP_BUILD_SCRIPT := /rd/test/android-ndk-r26d/helloword/Android.mk

3.2 编译过程

~/test/android-ndk-r26d/build/ndk-build

Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-21.
[arm64-v8a] Compile        : helloworld <= hello.c
[arm64-v8a] Executable     : helloworld
[arm64-v8a] Install        : helloworld => libs/arm64-v8a/helloworld
[armeabi-v7a] Compile thumb  : helloworld <= hello.c
[armeabi-v7a] Executable     : helloworld
[armeabi-v7a] Install        : helloworld => libs/armeabi-v7a/helloworld
[x86] Compile        : helloworld <= hello.c
[x86] Executable     : helloworld
[x86] Install        : helloworld => libs/x86/helloworld
[x86_64] Compile        : helloworld <= hello.c
[x86_64] Executable     : helloworld
[x86_64] Install        : helloworld => libs/x86_64/helloworld

3.3 编译结果,默认会编译出不同架构的可执行文件

./helloword/libs/arm64-v8a/helloworld
./helloword/libs/x86/helloworld
./helloword/libs/x86_64/helloworld
./helloword/libs/armeabi-v7a/helloworld
./helloword/obj/local/arm64-v8a/objs/helloworld
./helloword/obj/local/arm64-v8a/helloworld
./helloword/obj/local/x86/objs/helloworld
./helloword/obj/local/x86/helloworld
./helloword/obj/local/x86_64/objs/helloworld
./helloword/obj/local/x86_64/helloworld
./helloword/obj/local/armeabi-v7a/objs/helloworld
./helloword/obj/local/armeabi-v7a/helloworld
 

3.4 测试执行

adb push  helloworld /data
data/helloworld
hello world!

3.5 编译说明

也可选择其他编译选项:

在jni目录或者helloword目录下执行:

ndk-build APP_ABI=all          //编译所有平台
ndk-build APP_ABI=armeabi-v7a  //编译armv7
ndk-build APP_ABI=mips         //编译mips

ndk-build APP_ABI=arm64-v8a //编译armv8A

其他ABI编译参考:build/cmake/abis.cmake

~/test/android-ndk-r26d/build/ndk-build // 默认多架构编译

生成的可执行文件在helloworld/libs或者helloword/obj下,不同平台对应不同的目录。


http://www.ngui.cc/article/show-2100787.html

相关文章

word标题格式批量设置方法

1.直接全选ctrlA 全选后然后统一进行编辑&#xff08;适用于标题是紧挨着的情况&#xff09; 2.直接修改对应几级标题格式&#xff0c;然后应用于自己所需要的标题&#xff08;可能会导致上面修改后但是下面不会自动更改&#xff0c;此时用第三种方法&#xff09; 点击[开始…

互联网洗护工厂系统能带来哪方面的便捷

我们的干洗店洗衣洗鞋小程序&#xff0c;为您带来便捷、智能的洗衣洗鞋体验。只需轻触屏幕&#xff0c;即可在线预约洗衣服务&#xff0c;随时随地&#xff0c;无需等待&#xff0c;告别繁琐的电话预约。 用户成为会员&#xff0c;您将独享专属优惠与折扣&#xff0c;更有积分累…

如何配置Always On 可用性组

配置SQL Server的Always On可用性组是一个相对复杂的过程,涉及多个步骤。以下是一个简化的配置流程: 先决条件: 确保你正在使用SQL Server的企业版或开发人员版,因为Always On可用性组功能在这两个版本中是可用的。部署Always On可用性组需要一个Windows Server故障转移群集…

Python内置函数oct()详解

Python中的oct()函数是一个内置函数&#xff0c;用于将一个整数转换成它的八进制字符串表示。 函数定义 oct()函数的基本语法如下&#xff1a; oct(x)x&#xff1a;一个整数。 函数返回x的八进制表示&#xff0c;以字符串形式。 基本用法 将整数转换为八进制 number 64…

vue3 使用WebAssembly 实战

在Vue 3中使用WebAssembly&#xff08;WASM&#xff09;的一个基本示例包括以下几个步骤&#xff1a; 1. 准备WebAssembly模块 首先&#xff0c;你需要一个WebAssembly模块。假设你已经有了一个编译好的.wasm文件&#xff0c;比如名为example.wasm。 2. 加载WebAssembly模块…

几个人脸库对于面部动作识别的功能比较

经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(A…

golang实现普通升管理员权限

golang实现普通升管理员权限 package mainimport ("fmt""os""path/filepath""runtime""syscall""unsafe""golang.org/x/sys/windows""golang.org/x/sys/windows/registry" )var (modntdll …

Delphi 7打造RESTful API客户端

分享一下如何使用Delphi 7来实现一个简单的RESTful API客户端。或许你会问&#xff0c;为啥选择Delphi 7&#xff1f;这不是一个已经有些年头的开发工具了吗&#xff1f;没错&#xff0c;Delphi 7确实是个“老古董”了&#xff0c;但有时&#xff0c;出于一些旧的项目或特定的需…

前端JS必用工具【js-tool-big-box】学习,检测当前是否为手机端浏览器,检测某元素是否处于当前可视范围内

这一小节&#xff0c;js-tool-big-box工具库又迎来了两个非常实用功能成员&#xff0c;分别是检测当前浏览器是否为手机端浏览器&#xff0c;还有检测某元素当前是否处于可视范围内。 1 安装引入 通过npm安装&#xff0c;执行以下命令 npm i js-tool-big-box 这两个功能&…

跨域数据流动:数据提取过程中的治理与安全双轮驱动

跨域数据流动&#xff1a;数据提取过程中的治理与安全双轮驱动 随着信息技术的飞速发展&#xff0c;跨域数据流动已成为现代社会的常态。从医疗记录到金融交易&#xff0c;从社交媒体到企业运营&#xff0c;数据在各个领域之间频繁交换&#xff0c;为社会发展带来了极大的便利…