使用NDK make编译so文件

Android用ndk编译c代码生成so库与调用 一般我们开发主要是使用Java,但项目中有些涉及到复杂的算法或耗时操作时,通常使用C/C++完成算法实现并提供给java层(通过JNI)调用,以此提高运行的效率。这种情况下,C/C++所实现的代码以及JNI调用相关的代码被打包为.so库。 笔者在在处理客户的一个问题时遇到了需要使用JNI调用c++算法的情况,之前也没有相关的经验,折腾了一番之后终于跑通,故整理一下整个过程。 本文以一个加法运算的简单功能为例,说明如何使用JNI开发。 环境工具的准备 系统:windows 10,工具:Android S 阅读详情

目录

1.安装环境

首先我们要去ndk的官网去下载一个ndk,这里笔者建议下载一个老一些的版本10~13左右,因为在比较新的一些ndk都是在make的时候会遇到各种各样的问题。

  1. 首先打开ndk的官网
    选择不受支持的旧版本。
  2. 选择需要的版本,笔者认为选择12 3左右应该可以 下载图片
  3. 下载完成后将其解压到C:盘或者是其他盘,笔者在这里放在D:盘。
  4. 将ndk的编译路径D:\android-ndk-rXX\prebuilt\windows-x86_64\bin;E:\AndroidCrack\platform-tools;
    放到系统变量环境的PATH里面
    路径 记得要在最后添加 ;
    英文的。
  5. 打开CMD 输入make 若出现下面这样则配置成功 make

到这里配置就算完成了,接下来就是编译了。

2.编译

  1. Makefile的编写
  2. 执行

笔者在这里用的是非虫大佬在《Android软件安全与逆向分析》提供的Makefile文件修改而来,到目前为止还能用。笔者在PC端的安卓模拟器测试还能用。
Makefile代码如下:


NDK_ROOT=D:\android-ndk-r17c #ndk 安装解压的目录
TOOLCHAINS_ROOT=$(NDK_ROOT)\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)\bin\arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)\lib\gcc\arm-linux-androideabi\4.9.x\include-fixed

PLATFORM_ROOT=$(NDK_ROOT)\platforms\android-14\arch-arm
PLATFORM_INCLUDE=$(PLATFORM_ROOT)\usr\include
PLATFORM_LIB=$(PLATFORM_ROOT)\usr\lib

MODULE_NAME=user
BUILD_TYPE=c
PATH_ANDROID=/data/local/tmp/
RM=del


FLAGS=-I$(TOOLCHAINS_INCLUDE) \
	-I$(PLATFORM_INCLUDE) \
	-L$(PLATFORM_LIB) \
	-nostdlib \
	-lgcc \
	-Bdynamic \
	-lc \
	-pie -fPIE \ 

OBJS=$(MODULE_NAME).o \
	$(PLATFORM_LIB)/crtbegin_dynamic.o \
	$(PLATFORM_LIB)/crtend_android.o

all:
		$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -E $(MODALE_NAME).c -o $(MODALE_NAME).i		#产生 .i文件
	$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).c -o $(MODULE_NAME).o 	#产生 .o文件
	$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -S $(MODULE_NAME).c -o $(MODULE_NAME).s	#产生 .s汇编文件
	$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
clean:
	$(RM) *.o
install:
	adb push $(MODULE_NAME) /data/local/tmp
	adb shell chmod 755 /data/local/tmp/$(MODULE_NAME)
	adb shell /data/local/tmp/$(MODULE_NAME) 
run:
	adb shell /data/local/tmp/$(MODULE_NAME) 

例子:

#include<stdio.h>
int main(){
	
	printf("hello arm");
	return 0;
}

保存放到同一个文件夹
文件夹
然后在地址 然输入CMD 回车
打开CMD
输入make
编译完成
到这里的话编译已经完成我们打开文件夹
产生结果
接着打开模拟器运行输入

make install

运行结果
当你要再次运行时只需要输入

make run

run

3.遇到的一些问题及解决

  1. 找不到stdio.h文件
  2. only position independent executables (PIE) are supported

解决方法:

  1. 找不到stdio.h文件
    这个问题只会出现在一些较高版本的ndk里面,笔者用的是r17c也遇到了同样的问题,笔者在这里的解决方法是将r10e里的 android-ndk-r10e\platforms\android-14\arch-arm\usr 里的 include文件 复制到 ==D:\android-ndk-r17c\platforms\android-14\arch-arm\usr == 里面至此完美解决。

2.only position independent executables (PIE) are supported错误
只需要在Makefile里的里添加 == -pie -fPIE \ ==

FLAGS=-IKaTeX parse error: Undefined control sequence: \ at position 22: …HAINS_INCLUDE) \̲ ̲ -I(PLATFORM_INCLUDE)
-L$(PLATFORM_LIB)
-nostdlib
-lgcc
-Bdynamic
-lc
-pie -fPIE \


参考文档:
1.丰强生 《Android软件安全与逆向分析》
2.only position independent executables (PIE) are supported的解决问题. https://blog.youkuaiyun.com/hxdanya/article/details/39371759
3ndk生成ARM汇编(附代码). https://blog.youkuaiyun.com/earbao/article/details/53933023

Android使用MuPDF查看pdf文件之源码的下载与编译 官网下载源码地址:点击打开链接 0、可以直接下载压缩包,也可以使用git拉取代码。我这里用的是直接下载。下载的版本为1.10。 (1.11的版本platform文件夹下没有Android这个文件夹,不会用,所以还是用的1.10版本) 1、下载后放到Linux虚拟机,然后使用make generate编译(也可在Windows下cygwin下编译,可尝试一下)。编译后得到gen 阅读详情

相关推荐

从原理图到PCB:Cadence Allegro 17.4网表同步全流程详解(含第三方网表配置)

本文详细解析了Cadence Allegro 17.4中从Orcad原理图到PCB布局的网表同步全流程。核心内容包括标准的第一方网表同步步骤,以及针对第三方网表导入时关键的封装库路径配置方法,并提供了常见同步错误的排查思路,帮助工程师高效、准确地完成设计数据传递,确保PCB设计顺利开局。

salt9的博客 655

Android Studio 配置NDK并编译JNI文件so库 APP调用jni源码实例

Android:配置NDK并编译JNI文件so库 APP调用jni源码实例 一、Android studio 版本3.4.1 二、Android studio自带NDK 二、配置javah及ndk-build快速构建工具 1、配置ndk-build 用来编译jni,File-Settings-Tools-External Tools + Program:C:\Android\Sdk\ndk-bundle\ndk-build.cmd (根据自己............

海月汐辰 4805

用Python+ArcGIS分析厦门共享单车数据:5分钟搞定订单时长与距离分布的可视化

本文详细介绍了如何利用Python和ArcGIS Pro 3.x快速分析厦门共享单车数据,实现订单时长与距离分布的可视化。通过数据清洗、预处理和高级可视化技巧,揭示用户行为特征,为运营优化提供数据支持。文章还提供了环境配置、代码示例和业务洞察,帮助开发者高效完成数据分析任务。

weixin_28327051的博客 338

Android NDK 编译时出现make (e=2): 系统找不到指定的文件错误

用NDK 编译so时, toolchains版本设置不正确导致出现“make (e=2): 系统找不到指定的文件”错误

luuillu的专栏 9269

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 926

离线路径规划服务Graphhopper

离线路径规划服务Graphhopper 本文主要探索使用Graphhopper搭建离线路径规划服务,需要掌握一定的JAVA基础环境配置的知识 文章目录离线路径规划服务Graphhopper前言一、Graphhopper是什么?二、使用步骤1.下载Graphhopper2.从OpenStreetMap下载路图数据3.安装Graphhopper所需环境4.修改配置5.启动Graphhopper总结 前言 在外网环境中可以使用百度、高德等第三方的sdk用以实现路径规划的功能,由于项目的需要,在离线环境中需要使

Sysdark的博客 7560

Android NDK 编译时出现make (e=2): 系统找不到指定的文

今天编译一个so文件时出现如下错误: C:\Users\xxj\Desktop\test\OpenCamera&gt;ndk-build [armeabi-v7a] Compile++      : SeetafaceSo &lt;= face_detection.cpp process_begin: CreateProcess(NULL, D:/eclipse_ADT/ndk/androi...

谢小军的专栏 8210

android11-修改屏幕显示方向和触摸方向

参数0表示12点钟方向显示参数90表示3点钟方向显示参数180表示6点钟方向显示参数270表示9点钟方向显示。

Paper_Love的博客 2118

Android高级-NDK-C++MakeFile走读与语法基础

1:什么是makefile 1:Makefile:定义 makefile定义了一系列的规则来制定,哪些文件需要先编译,哪些文件需要重新编译,如何进行链接等操作 makefile就是“自动化编译”,告诉make命令如何编译和链接 2:Makefile里面有什么: 1:显示规则 2:隐晦规则 3:变量定义 4:文件指示(引用 指定makefile有效部分) ...

u013815832的博客 373

第十一届全国大学生GIS应用技能大赛——广西区域发展布局示意图

我们需要制作一幅广西区域发展布局示意图,最终成图参考“数据”文件夹中的广西区域发展布局示意图.png。地图使用的投影坐标系是 Asia_North_Albers_Equal_Area_Conic,其中地理坐标系是China_Geodetic_Coordinate_System_2000,中央经线东经 105°,标准纬线是北纬 25°和北纬 47°,出图比例尺 1:4,780,000。

@HNUSTer的博客 7799

使用MATLAB实现PAC2002轮胎模型的TIR文件解析和模型计算详解

PAC2002轮胎模型是由荷兰TNO公司开发的一种半经验的轮胎模型,用于描述轮胎在不同工况下的力学特性。该模型基于一系列物理和经验参数,通过复杂的数学表达式来模拟轮胎的力学行为,包括纵向力、侧向力、回正力矩等。

qq_38334677的博客 2429

mac编译android so文件,Mac下交叉编译FFmpeg3.4.5出Android的so包

在网上找了很多资料都从未编译成功过,一度特别失望;终于看了夏曹俊老师的视频播放器开发课之后也经过几番周折,最后成功了,在此总结一下,希望对在寻找资料的人有所帮助。准备工作这里两大主角就是:FFmpeg(版本是3.4.5)NDK(版本android-ndk-r15c)特别注意这里版本是关键,下错了估计不行我最开始下载了ffmpeg4.1不行,4.0.3还是不行,最后使用了3.4.5终于可以了;当然这...

weixin_42514910的博客 387

一文掌握DrissionPage的详细使用

是一个基于 Python 的网页自动化工具,主要用于网页数据的抓取、自动化操作和测试。它结合了 Selenium 和 Requests 的优点,提供了更简洁、高效的 API,适用于各种网页自动化任务。DrissionPage 是一个功能强大且易于使用的网页自动化工具,适用于各种网页自动化任务。希望本文的 DrissionPage 的基本使用方法和一些高级功能能够帮助到你。

数据知道的博客 1万+

android ffmpeg编译so,Android开发之——Ubuntu下编译FFmpeg生成.so文件

前言FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。市面上常见的播放器如:暴风影音、QQ影音、KMP、GOM Player、PotPlayer等都使用了该开源项目。编译本文主要讲述在Ubuntu下,使用开源项目FFmpeg编译成.so文件。本文只讲实际动手操...

weixin_35373786的博客 403

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NDK报错:make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。

转自:http://blog.youkuaiyun.com/imyang2007/article/details/7580111 android开发用ndk编译so库时,有时直接从别的地方拷贝Android.mk文件,会报: make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。 出现这个这个错误,可能是因为and

Gabriel的专栏 3147

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

mac编译android so文件,Mac 下 Android Studio 3.3 简单生成so文件

本文内容参考多位大神的截图和代码。只是总结一下,可以更快的配置好。一. 配置环境安装 NDK。2.Android Studio里安装。菜单栏 Tools ----> SDK Manger ----> SDK TOOLS .查找 到NDK下载。二. 打开AndroidStudio新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++...

weixin_39851872的博客 541

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android FFMPEG音视频开发(二)

Android FFMPEG

WillScorpio 773

Bash语法入门、交叉编译基础、NDK编译介绍、ADB等

Bash Shell语法入门、交叉编译设置、使用 ndk-build 编译C/C++代码

水木年崋 594

在windows上编译openssl供Android NDK使用

由于linux自带openssl,编译android系统时,不必编译openssl,要是我们自己写Android程序,尤其是在Windows上写Android小程序,就必须要重新编译Openssl了。 首先必备条件是安装NDK,我的windows上得NDK是R10d版本,并配置好环境变量,接下来下载openssl代码,链接是https://github.com/guardianproject/o

bupt073114的专栏 1万+

ffmpeg 编译android so 文件

把一下文件拷贝到ffmpeg   ================================================================================ #!/bin/bash NDK=$ANDROID_NDK SYSROOT=$NDK/platforms/android-L/arch-arm/ TOOLCHAIN=$NDK/to

374

android openssl 编译环境,android openssl windows环境编译使用

转自:http://blog.youkuaiyun.com/zhouli_csdn/article/details/51550427由于linux自带openssl,编译Android系统时,不必编译openssl,要是我们自己写Android程序,尤其是在Windows上写Android小程序,就必须要重新编译Openssl了。首先必备条件是安装NDK,我的windows上得NDK是R10d版本,并配置好...

weixin_34226447的博客 758

Android基于ndk和cmake开发C++命令行程序

Creating a simple Hello World application Using Android NDK with C++ · GitHub android Ndk学习笔记01之Hello World! - 简书 https://developer.android.com/ndk/samples/sample_hellojni

LuchangLi 的专栏 2796

Linux环境编译ffmpeg生成.so库

ffmpeg官网 编译错误: make: *** No rule to make target '/tests/Makefile'. Stop. Unknown option "--disable-ffserver". See ./configure --help for available options. 出现这个错误的原因可能是ffmpeg版本过高或者NDK版本过高 ...

look to the master, follow the master, 3011

Ubuntu ijkplayer 编译android的so文件

jdk版本:直接使用 sudo apt-get install -y openjdk-8-jdk。git版本:直接使用 sudo apt-get install -y git。make版本:直接sudo apt-get install -y make。开始下载NDK 并解压,通过pwd 获取NDK路径。通过git下载ijkplayer。执行 comple-ijk.sh。

zhuxing1990的博客 279

使用IntelliJ IDEA 编译Android JNI

使用IntelliJ IDEA首先需要导入Android SDK

lambda的博客 4672

android ubuntu下NDK的开发

[size=medium]默认eclipse + android sdk 都已经配置完成 1 下载andriod NDK for linux http://dl.google.com/android/ndk/android-ndk-1.6_r1-linux-x86.zip[/size] [img]http://hi.youkuaiyun.com/attachment/201009/...

qq6513568061的博客 109
上一篇: 腾讯云主机学生版 修改主机名
下一篇: markdown快速入门
liuxin303
博客等级 码龄9年 15粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值