2024-7-9 Windows NDK,Clion,C4droid 编译环境配置(基础|使用命令编译,非AndroidStudio),小白(记录)友好型教程

2024-7-9 Windows NDK,Clion,C4droid 编译环境配置(基础|使用命令编译),小白友好型

一直想使用NDK编译出lua库,然后进行开发.结果一直不成功,问题Bug出现了一堆(主要还是自己太菜,毕竟咱是编程散修一名>_<)

NDK之前一直不会配置(直接用命令配置的那种,非AndroidStudio),一直用的Clion,但是结果发现编译lua源码时,搞不定,摸索了两天终于搞定了

为啥非要编译Lua源码???

因为想搞一些C/C++的操作,但是纯C写起来很繁琐,就想着,直接搞lua(为了之后大量的简化代码,制作LuaCAPI,在Lua里调用)

而且通过以上方式可以实现点小动态的操作,而不是C那种静态的操作了

如果你也有和我一样的需求的话,就来看看吧

当然这不仅仅局限于lua源码的编译,像很多开源的JNI(可执行/静态库)都可由用这种方式搞定

以前在手机上使用C4droid编译的lua源码->liblua.so也是可以跑的,但是,要别的架构,就只能NDK了(别的我也不会)

我将介绍多种操作

1.C4droid编译Lua配置

2.Clion编译可执行文件(放到/data/local/tmp)可以直接跑的那种

3.Clion编译可动态链接库文件(libtest.so)需要通过dlopen加载的那种

Clion编译Lua我就不演示了,因为不会>_<!!!

4.NDK编译不同架构Lua源码

最繁琐的其实是Clion(可能我菜,不会方便的配置)

主要是网上的教程对我来说不太友好(对小白不友好),所以搞出来,就赶紧记录了

本教程仅用于记录编程配置处理!!!

本教程仅用于记录编程配置处理!!!

本教程仅用于记录编程配置处理!!!

为编程爱好者解决一些问题 >_<

0.做点初始化准备

第一步是必须,后面根据自身需求选择
1.下载Lua源码 (下载你需要的版本)https://www.lua.org/ftp/
2.下载C4droid(手机)自行百度
3.下载NDK(电脑)
NDK下载镜像站https://github.com/android/ndk/wiki/Unsupported-Downloads
4.下载Clionhttps://www.jetbrains.com.cn/clion/

在这里插入图片描述

1.C4droid编译Lua配置(一键配置)

解压lua源码

在源码下面创建by.sh,复制我写的配置,

进入C4droid模拟器

# 切换到你的源码目录
cd 到你lua源码目录
# 执行编译
./by.sh
# 等待编译....# 提示复制头文件啥的,直接扣y# 配置C4droid GCC,G++参数# 创建测试的tes.cpp,script.lua
# 我使用的是G++运行
# 想要使用GCC运行,可以看tes.cpp前面的注释# 运行测试# ok了,你现在就可以用手机编写CLUA了

请添加图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

by.sh

#!/system/bin/sh
# Lua源码src路径
cd ./src/
#清除原编译
make clean
#执行静态编译
make linux
echo "$.静态编译完成"#转动态
gcc -shared -fPIC -Wl,--whole-archive liblua.a -Wl,--no-whole-archive -Wl,-soname,liblua.so -o liblua.so -lm -ldl
echo "$.动态liblua.so编译完成"#!/bin/sh# 源文件路径
src_dir="./"# 目标目录路径
dest_lib_so="/data/user/0/com.n0n3m4.droidc/files/gcc/lib64/"
dest_include="/data/user/0/com.n0n3m4.droidc/files/gcc/aarch64-linux-android/include/"# 是否复制相应文件到指定目录下? (y/n)
echo "是否复制liblua.so和必要h文件到lib64和include目录下? (y/n)"
read inputcase "$input" iny | Y)echo "Continuing..."# 复制liblua.sosrc_lua_so="$src_dir/liblua.a"cp "$src_lua_so" "$dest_include../lib/"chmod 700 "$dest_include../lib/liblua.a"echo "liblua.a copied successfully."# 复制头文件cp "$src_dir/lauxlib.h" "$dest_include"chmod 777 "$dest_include/lauxlib.h"echo "lauxlib.h copied successfully."cp "$src_dir/lua.h" "$dest_include"chmod 777 "$dest_include/lua.h"echo "lua.h copied successfully."cp "$src_dir/lua.hpp" "$dest_include"chmod 777 "$dest_include/lua.hpp"echo "lua.hpp copied successfully."cp "$src_dir/luaconf.h" "$dest_include"chmod 777 "$dest_include/luaconf.h"echo "luaconf.h copied successfully."cp "$src_dir/lualib.h" "$dest_include"chmod 777 "$dest_include/lualib.h"echo "lualib.h copied successfully.";;n | N)echo "Exiting..."# 执行退出操作,例如:# exit 1;;*)echo "Invalid input. Please enter 'y' or 'n'.";;
esac

tes.cpp

/*
GCC 使用以下头文件
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>G++使用
#include <lua.hpp>*/
#include <lua.hpp>
int main() {// 初始化Lua环境lua_State* L = luaL_newstate();luaL_openlibs(L);// 加载并运行Lua脚本if (luaL_dofile(L, "script.lua")){perror("脚本加载失败");return 0;}// 调用Lua函数lua_getglobal(L, "add");lua_pushnumber(L, 10);lua_pushnumber(L, 20);lua_pcall(L, 2, 1, 0);// 获取函数返回值并输出int result = (int)lua_tonumber(L, -1);printf("Result = %d\n", result);// 释放Lua环境lua_close(L);return 0;
}

script

function add(a,b)
print("Lua.函数add调用成功!")
return a+b
end--add(1,5)

C4droid配置结束

2.解压NDK(这是后面的前提)

3.Clion编译操作

1.配置Clion,配置后别忘记点应用>_<!!!

在这里插入图片描述
在这里插入图片描述

参数模板

-G Ninja
-DCMAKE_TOOLCHAIN_FILE="你NDK路径\build\cmake\android.toolchain.cmake"
-DCMAKE_SYSTEM_NAME=Android
-DANDROID_ABI=编译的架构,一次好像只能写一个
-DCMAKE_ANDROID_NDK="你NDK路径"
-DCMAKE_SYSTEM_VERSION=19 
-DCMAKE_C_FLAGS="" 
-DCMAKE_CXX_FLAGS="" 
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang++ 
-llog

这里只能一次配置一个架构,自己研究吧,我就不深究了

我的是,编译arm64-v8a架构的

-G Ninja
-DCMAKE_TOOLCHAIN_FILE="D:\NDK\android-ndk-r21e\build\cmake\android.toolchain.cmake"
-DCMAKE_SYSTEM_NAME=Android
-DANDROID_ABI=arm64-v8a
-DCMAKE_ANDROID_NDK="D:\NDK\android-ndk-r21e\" 
-DCMAKE_SYSTEM_VERSION=19 -DCMAKE_C_FLAGS="" 
-DCMAKE_CXX_FLAGS="" 
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang++ -llog
2.编译配置(按照自己需求配置)

修改CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
# 工程名字
set(projectName 你创建的项目名,直接把原CMakeLists.txt里的project里的内容复制过来)# ----------------------------------------[默认通用配置]--------------------------------------
project(${projectName})set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Release)# 添加头文件
set(INC_DIR src)
# 设置第三方库 --- 一般引用liblua.o这种静态库时会用到
set(LINK_DIR lib)
include_directories(${INC_DIR})
link_directories(${LINK_DIR})# 配置多个目标架构 -- 这里配置主要是把生成的文件,放到指定的目录下,便于区分
set(TARGET_ARCHS "arm64-v8a" "armeabi-v7a" "x86" "x86-64")foreach (arch ${TARGET_ARCHS})# 为每个目标架构创建一个单独的目录set(ARCH_DIR "${CMAKE_CURRENT_BINARY_DIR}/${arch}")file(MAKE_DIRECTORY ${ARCH_DIR})# 配置交叉编译set(CMAKE_SYSTEM_NAME Android)set(CMAKE_ANDROID_NDK "${ANDROID_NDK}")set(CMAKE_ANDROID_ARCH_ABI ${arch})set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)set(CMAKE_ANDROID_API 19)set(CMAKE_ANDROID_STL_TYPE c++_static)# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")# -fPIC 好像高于Android5.0都需要,不需要改set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fexceptions -frtti -stdlib=libc++ -fPIC")set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lc++_shared")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wfatal-errors")# ----------------------------------------[结束]--------------------------------------# ----------------------------------------[优化大小]--------------------------------------# 这里是因为,有时候编译出来比较臃肿# 比如C4droid,HelloWord 编译出来可能就6-8KB大小# 但是Clion编译出来可能 几 MB# 这一块就是为了优化大小 # 优化大小add_compile_options(-Os)# 将每个函数放在自己的节中add_compile_options(-ffunction-sections -fdata-sections)# 移除未使用的节set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}" -WI,--gc-sections )# 省略帧指针add_compile_options(-fomit-frame-pointer)# ----------------------------------------[结束]--------------------------------------set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s")set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s")# ======= 添加要编译的文件 ======# ---------------------------------------[可执行文件配置]-------------------------------------------# 生成二进制文件 add_executable 编译可执行文件add_executable(${projectName}${arch}main.cpp)set_target_properties(${projectName}${arch} PROPERTIES OUTPUT_NAME "${projectName}")set_target_properties(${projectName}${arch} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ARCH_DIR})# ----------------------------------------[结束]--------------------------------------# ---------------------------------------[链接静态库配置]-------------------------------------------#target_link_libraries(${projectName}${arch}  ${PROJECT_SOURCE_DIR}/lib/${arch}/liblua.a)# ----------------------------------------[结束]--------------------------------------# __________________________分类________________________________# ---------------------------------------[动态链接库编译配置]-------------------------------------------# 编译动态链接库文件# add_library(${projectName}${arch} SHARED ...cpp)# set_target_properties(${projectName}${arch} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${ARCH_DIR})# ----------------------------------------[结束]--------------------------------------endforeach ()
3.第三方静态库目录配置

.a静态库配置路径

在这里插入图片描述

库对应的.c .cpp .h .hpp…文件
在这里插入图片描述

4.直接编译

在这里插入图片描述

5.运行肯定报错,你是Windows编译的安卓可执行文件,肯定不能运行
6.可以像我这样配置一下(这里看自己需求)

$$$ 记得先ADB连接手机,需要ROOT,模拟器也行(MuMu支持ARM64部分),其他的模拟器都是x86/x86-64的,我直接用的VMOS(嘻嘻*_<),自己捣鼓吧

adb push 你生成的文件 /data/local/tmp

在这里插入图片描述

在项目目录下创建a.bat

@echo off
:: 切换UTF-8字符
chcp 65001 > nul
cls
echo 开始传输
adb push cmake-build-debug/arm64-v8a/lua_test /data/local/tmp
echo 传输结束
echo.
echo.
echo.
echo =======================================================
echo 开始给予777权限
@REM 这里修改名字 adb shell chmod 777 /data/local/tmp/你push的进去的名字
adb shell chmod 777 /data/local/tmp/lua_test
echo ====================[开始执行]===========================
echo.
@REM 运行 adb shell su -c /data/local/tmp/你push的进去的名字
adb shell su -c /data/local/tmp/lua_test
echo.
echo =======================================================

4.NDK编译Lua源码(所有架构配置)

1.环境搭建

NDK下载镜像站https://github.com/android/ndk/wiki/Unsupported-Downloads

2.环境变量配置

添加 NDK_HOME -> 你的NDK路径
添加 %NDK_HOME%\prebuilt\windows-x86_64\bin%NDK_HOME%

在这里插入图片描述

3.配置Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
LOCAL_MODULE    := lua
LOCAL_SRC_FILES := lapi.c lauxlib.c lbaselib.c lcode.c ldblib.c ldebug.c ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c ltm.c lundump.c lvm.c lzio.c
LOCAL_LDLIBS    := -ld -lminclude $(BUILD_STATIC_LIBRARY)

4.配置Application.mk

APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
APP_PLATFORM := android-14

5.把lua源码里的src名字改成jni

在这里插入图片描述

6.把Android.mk和Application.mk放到jni下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.编译

cd D:\lua-5.4.6\
ndk-build

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.结束了>_<

你都看到这里了,咱也不是收费的,

给个大大的赞再走呗>*_<

赞留下>*_<

赞留下>*_<

赞留下>*_<

赞留下>*_<

赞留下>*_<

不定时更新!!!

可能含金量不高,但是绝对实用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373018.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PID控制与模糊PID控制的比较

一、PID控制器的设计 1.PID控制原理图&#xff1a; PID控制其结构框图如下图所示&#xff1a; 图1&#xff1a;PID控制器结构框图 2.PID控制器传递函数的一般表达式 PID控制器传递函数的一般表达形式为&#xff1a; 其中kp为比例增益&#xff1b;ki为积分增益&#xff1b;k…

昇思25天学习打卡营第22天 | Shufflenet图像分类

ShuffleNet图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有…

uniapp 表格,动态表头表格封装渲染

1.接口表格数据&#xff1a; {"headers": [{"label": "实例名","name": "v1","order": 1,"hide": false,"dateTypeValue": null},{"label": "所属科室","name&quo…

[从0开始轨迹预测][NMS]:NMS的应用(目标检测、轨迹预测)

非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;简称NMS&#xff09;是一种在计算机视觉中广泛应用的算法&#xff0c;主要用于消除冗余和重叠的边界框。在目标检测任务中&#xff0c;尤其是在使用诸如R-CNN系列的算法时&#xff0c;会产生大量的候选区域&#x…

【Linux进阶】文件系统3——目录树,挂载

前言 在Windows 系统重新安装之前&#xff0c;你可能会事先考虑&#xff0c;到底系统盘C盘要有多大容量&#xff1f;而数据盘D盘又要给多大容量等&#xff0c;然后实际安装的时候&#xff0c;你会发现其实C盘之前会有个100MB的分区被独立出来&#xff0c;所以实际上你就会有三个…

10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的数据类型&#xff08;字符、数字、矩阵、字符串和元胞&#xff09;合并为字符串&#xff0c;然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码&#xff0c;展示如何将不同数据类型合并为字符串&#xff0c;并以不…

ElementPlusError: [ElPagination] 你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档 - 报警告之一

一、问题描述&#xff1a; 今天在使用elementui plus的时候遇到了一个奇葩的问题&#xff0c; 就是提示 使用了一些已被废弃的用法&#xff0c; 奇葩就在于我是 复制另一个页面的分页&#xff0c; 一摸一样的东西&#xff0c;就只这个页面报错&#xff0c; 分页也不出 为了这个…

C# Bitmap类型与Byte[]类型相互转化详解与示例

文章目录 一、Bitmap类型转Byte[]类型使用Bitmap类的Save方法使用Bitmap类的GetBytes方法 二、Byte[]类型转Bitmap类型使用MemoryStream将Byte[]数组转换为Bitmap对象使用System.Drawing.Imaging.BitmapImage类 总结 在C#编程中&#xff0c;Bitmap类型和Byte[]类型之间的相互转…

运动爱好者的新选择:哈氪聆光气传导耳机,轻巧又安全

平时不管是漫步街头、骑行穿梭&#xff0c;还是乘坐公共交通时&#xff0c;我总是喜欢佩戴耳机&#xff0c;借此隔绝外部的喧嚣&#xff0c;享受音乐的乐趣。在户外使用耳机&#xff0c;我更倾向于选择气传导耳机&#xff0c;它们更符合我的需求&#xff0c;因为这种耳机能让我…

在 PostgreSQL 里如何处理数据的版本跟踪和回滚?

文章目录 一、事务二、保存点三、使用版本控制扩展四、审计表和触发器五、使用时间戳列六、比较和还原数据七、考虑数据备份和恢复八、结论 在数据库管理中&#xff0c;数据的版本跟踪和回滚是非常重要的功能&#xff0c;有助于在数据操作出现错误或需要回滚到特定状态时进行有…

Mysql笔记-v2

零、 help、\h、? 调出帮助 mysql> \hFor information about MySQL products and services, visit:http://www.mysql.com/ For developer information, including the MySQL Reference Manual, visit:http://dev.mysql.com/ To buy MySQL Enterprise support, training, …

Windows11配置WSL2支持代理上网

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装WSL2分发版二、配置步骤三、测试总结 前言 说起来本来这个功能我也不需要的&#xff0c;只是最近突然有个需求就顺便研究了下&#xff0c;WSL2默认的网…

Dynamics365 UCI下的高级查找(不要留恋Classic了)

UCI界面已经用了多年了&#xff0c;在Classic下的的高级查找按钮(漏斗icon)已不见踪影 但因为使用习惯问题&#xff0c;还是有人会通过右上角高级设置&#xff0c;进入Classic界面找到漏斗Icon来使用高级查找 但新的UCI风格下已经没了高级查找的概念&#xff0c;取而代之的是基…

评估测试用例有效性 5个方面

评估测试用例的有效性是确保软件测试活动能够达到预期目标的关键步骤&#xff0c;有助于测试团队优化测试计划&#xff0c;提高测试效率&#xff0c;减少返工&#xff0c;节省成本。如果缺乏对测试用例的有效性评估&#xff0c;可能会导致测试用例无法覆盖关键功能点&#xff0…

python爬虫基础入门

步骤 获取网页内容&#xff1a; http请求 python的Requests库 解析网页内容 html网页结构 python的Beautiful Soup库 储存或分析数据 储存进数据库 作为ai分析的数据 转化为图表显示出来 DDoS攻击 通过给服务器发送海量高频请求&#xff0c;大量消耗网页资源&#…

JavaScript-日期对象

日期对象 作用&#xff1a;用来表示时间的对象 获取当前时间 const datenew Date();console.log(date);可以得到日期对象&#xff0c;里面的属性有星期&#xff0c;年月日&#xff0c;时分秒 获取指定时间 const datenew Date(2023-05-01);console.log(date); 获取时间戳 时间…

【论文阅读】AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising

论文&#xff1a;2406.06911 (arxiv.org) 代码&#xff1a;czg1225/AsyncDiff: Official implementation of "AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising" (github.com) 简介 异步去噪并行化扩散模型。提出了一种新的扩散模型分布式加…

Hospital Management Startup 1.0 SQL 注入漏洞(CVE-2022-23366)

前言 CVE-2022-23366是一个影响HMS v1.0的SQL注入漏洞。该漏洞存在于patientlogin.php文件中&#xff0c;允许攻击者通过特定的SQL注入来获取或修改数据库中的敏感信息。 具体来说&#xff0c;攻击者可以通过向patientlogin.php发送恶意构造的SQL语句来绕过身份验证&#xff…

Chiasmodon:一款针对域名安全的公开资源情报OSINT工具

关于Chiasmodon Chiasmodon是一款针对域名安全的公开资源情报OSINT工具&#xff0c;该工具可以帮助广大研究人员从各种来源收集目标域名的相关信息&#xff0c;并根据域名、Google Play应用程序、电子邮件地址、IP地址、组织和URL等信息进行有针对性的数据收集。 该工具可以提…

语义分割和实例分割区别?

语义分割&#xff1a;将图像中的每个像素分配给其对应的语义类别&#xff0c;其主要针对于像素&#xff0c;或者说它是像素级别的图像分割方法。&#xff1a;语义分割的目的是为了从像素级别理解图像的内容&#xff0c;并为图像中的每个像素分配一个对象类。 实例分割&#xf…