Android NDK : 自己动手做so库

动手打造Android7.0以上的注入工具 动手打造Android7.0以上的注入工具 在不使用Xposed的一些场景下,想要Hook进入目标APK的方法,最直接有效的方法是注入代码到目标APK,进而完成Hook操作。 面临的挑战 编写注入工具的原理是借助安卓系统的ptrace接口,操纵目标进程的内存,修改进程空间的数据与代码,然后调用dlopen()、dlsym()等接口加载与使用动态库,完成达到注入so的目的。 ptrace接口... 阅读详情

Android NDK : 自己动手做so库

前言 :

在上一篇 Android NDK : NDK开发概要 中大体记录了下Android NDK的概念,工具包以及简单了自动编译链接实现了一个hello NDK的小demo 。
现在让我们不使用NDK的自动编译链接的功能,来自己一步步的实现前面的小demo 。即亲自动手来实现我们的动态链接库 。

创建要调用本地代码的java类:

首先在我们的android项目工程中的src目录下编写要调用native的Java类 ,

package com.cumt.ndktest2;

public class HelloAndroidNDK {
	
	static{
		//加载本地的c库文件
		System.loadLibrary("helloAndroidNDK");
	}
	
	//声明c库中的本地方法
	public native String sayHelloToNDK();
}

写好后ctrl + S 保存后就会自动在bin目录下的class文件夹下生成一个.class文件,如图所示:


接下来我们就利用这个文件来生成我们所需要的头文件

生成本地代码的头文件:

在android项目工程的根目录下新建一个jni文件夹,我们准备将生成后的头文件放在这个文件夹下 。
然后在dos中通过javah命令生成头文件 (如果你找不到javah指令那是没有配置环境变量的原因,javah指令在java的jdk的bin目录下)
javah使用方法如图所示:



此时在jni目录下就生出了头文件,在eclipse中refresh一下jni文件夹就可以看到了 :



在上一节中已经说过命名的格式,这里就不再说了。下面我们就可以让其他成员根据这个头文件和需求编写C/C++的代码,生成动态库,
再给我们使用(在具体工作中)。现在我们来自己实现这个函数 。

根据头文件编写本地代码:

//com_cumt_ndktest2_HelloAndroidNDK.c
#include "com_cumt_ndktest2_HelloAndroidNDK.h"
JNIEXPORT jstring JNICALL Java_com_cumt_ndktest2_HelloAndroidNDK_sayHelloToNDK
  (JNIEnv *env, jobject thiz)
{
	return (*env)->NewStringUTF(env,"Hello Android NDK");
}

我们返回一个字符串:“Hello Android NDK” 。

makefile文件编写:

现在开始编写makefile文件 ,其实原理和linux下差不多 ,我们看这个简单的示例 ,在jni目录下新建一个文件Android.mk :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := helloAndroidNDK
LOCAL_SRC_FILES := com_cumt_ndktest2_HelloAndroidNDK.c

include $(BUILD_SHARED_LIBRARY)

先来解释一下makefile中这些参数的含义 :

LOCAL_PATH := $(call my-dir)     Android.mk 文件必须以这个开头,用来辨识源文件的路径 $(call my-dir) 表示当前路径下即和Android.mk 位于同一个目录下 ,
也就是说我们的源文件需要和Android.mk文件在同一文件夹下。

LOCAL_MODULE    := helloAndroidNDK    我们编译链接后生成的库的名称  ( 比如动态库最终是  libhelloAndroidNDK.so)

LOCAL_SRC_FILES := com_cumt_ndktest2_HelloAndroidNDK.c  源文件

include $(BUILD_SHARED_LIBRARY) 标识生成动态库 (也可以通过 BUILD_STATIC_LIBRARY生成静态库)

使用cygwin编译链接生成动态库:

我们使用cygwin来在window下模拟一个linux环境进行动态库的生成操作。
我们将jni文件夹copy到下载后解压的ndk的根目录下 

然后在cygwin的终端界面进入到jni目录下,使用ndk-build指令 ,如下图所示 :



然后我们发现在ndk的根目录下生成了一个文件夹libs, 打开后是一个文件夹armeabi,在该文件夹下就生成了我们所需要的动态库——libhelloAndroidNDK.so 。
然后我们就可以在android项目中来使用这个so包了 。

注意事项 :

在cygwin中使用 ndk-build 失败,如果不是代码问题(或者提示make出错),可能是你的cygwin没有安装make工具 ,可以重新打开cygwin的安装包,然后在选择安装工具的界面
中输入make进行搜索然后进行安装。

关于makefile这里只是简要的说明了一下 。

参考:

主要参考资料 NDK的官方文档 ,官方文档中对于NDK工具的整个使用过程进行了详细介绍,在NDK的sample文件夹下
可以找到很多学习的代码 。



NDK交叉编译及so库导入Android项目 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。以上就是总结的关于在面试的一些总结,希望对大家能有些帮助,除了这些面试中需要注意的问题,当然最重要的就是刷题了,这里放上我之前整理的一份超全的面试专题PDF还有。 阅读详情

相关推荐

Android so库的编译

在没弄明白so库编译的关系前,直接看网上博主的博文,常常会觉得云里雾里的,为什么一会儿通过Android工程cmake编译,一会儿又通过NDK命令去编译。两者编译的so库有什么区别?android版第三方库编译总体思路:对于新手小白来说搞明白上面的总体思路图很有必要,因为我一开始发现有些so库可以放在开发工程中拿来直接调用,而有些so库还需要放在开发工程中编译再调用。

nanke_yh的博客 1787

安卓NDK开发——使用CMake封装CPP文件成so库并调用so库

演示了NDK项目是如何导入与调用C++代码的,但很多时候,C++的实现代码并不能都给别人,所要把.cpp文件封装成.so文件,只留api接口给用户调用。要封装成.so文件分步,一是指定so文件输出的目录,二是指定哪些.cpp文件封装成.so 。

知来者逆的博客 3715

Android Studio NDK开发并调用so库

前言 什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就...

FZeroTHero的博客 2894

NDK编译Android可用so文件

JNIEnv* env:指向JNI环境的指针,通过它可以访问JNI提供的许多函数,这些函数用于操作Java对象、字符串、数组等。JNIEnv* env,jobject /* this */是方法需要的特定参数,后边可以跟C中需要的参数然后调用C的方法。编译完成后会在app->build->intermediates->cxx内找到包含各种ABI的so文件。jobject:调用该方法的Java对象实例即javaClass的实例对象。javaFile:Java调用方法类名。JNIEXPORT:导出方法。

guo_chao_liu的博客 1645

Linux下使用NDK进行so库的编译和生成

NDK的开发因为涉及到C/C++语言而让很多人感觉到难以捉摸,又涉及到Linux系统下的编译,更让很多人望而却步,但是,作为有理想的安卓开发人员,作为有理想的安卓开发人员,作为有理想的安卓开发人员,重要的事说三遍,为了理想还是要啃下这块硬骨头的,而且碰钉子是肯定的,一定要坚持啊。一、Linux下安装NDK下载NDK r17 https://developer.android.google.cn/n...

qiantanlong的博客 1万+

Linux下NDK编译so库

环境配置 1、NDK下载。地址:https://developer.android.google.cn/ndk/downloads/ 2、随便在哪个目录直接解压 3、配置系统环境变量 #vim /etc/profile 在文件末尾添加如下内容: export ANDROID_NDK=“ndk路径” export PATH=“ANDROIDNDK:ANDROID_NDK:ANDROIDN​DK:PA...

FZeroTHero的博客 2098

NDK 编辑C/C++ SO库

以下是我在window环境下编译SO库文件,以下过程亲测有效,在此做个笔记,以备后查! 1.配置NDK的开发环境   1).下载NDK,放到指定的目录下面   2).Preferences -> Andriod -> NDK -> NDK location 点击按钮【Browse...】 放置NDK的路径 ->OK 2.新建NDK开发工程   1).new -> New An

wb175208的专栏 707

Android用ndk编译c代码生成so库与调用

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

DikY_的博客 5310

Android NDK跨平台编译cpython

NDK跨平台编译cpython到Arm64-v8a。

liuxinbo_1984的专栏 273

Android studio 链接linux环境下ndk编译的so库

内容如其名,纯小白从零开始搞这个。原因是学长说要用as链接linux下ndk编译的so库,而不能直接用as生成,那么好的工具,说不用就不用了。不过既然有要求,那咱也不能含糊,脱下裤子,不不不,撸起袖子就是干。 1搭建的环境 windows10 1803版 VirtualBox 5.2.14版本下的debian-9.5.0-armd64虚拟机 Android studio 3.2 2linux方面 ...

蜂蜜味的哈士奇 1828

FFmpeg生成Android so库

Mac编译第一次接入FFmpeg,搞了整整一天,生成so库,可谓一波三折,功夫不负有心人有心人,终于搞定了。网上很多方案都是基于ndk14之前生成的,最新版本的ndk21和最新版本的FFmpeg4.3.1用不了,错误很大,搞了好一阵子发现在Linux系统中一直报错,刚刚开始以为c编译器没有,于是安装了,yum install yasm和nasm但是还是报错,然后把ndk换成ndk14才可以编译了,但是问题又来了,虽然编译成功了但是没有生成so库文件内容。

qq_52703909的博客 1167

Android NDK开发:打包so库及jar包供他人使用

Android的NDK开发相信各位已经精通各种姿势了。不过基本上都是那种native代码和java代码都在同一个工程中,因为应用从头到脚都是我们自己的,也不需要分离。但有时候可能需要我们自己把某些库打包起来供别人使用,或者使用别人提供给我们的库。本篇文章及下篇文章就讲讲so库如何打包。 一、目标及方式 这篇文章会讲第一种方式来打包so库,这种方式是基于jni层的,需要我们同时提供接口的jar包...

zuguorui的专栏 1万+

Android平台的Python3.5.so

重新编译的CrytaxNDK中的Python3.5so,可支持ssl,可在 Android的Armabi上运行的so

c++封装so库,供安卓android调用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

刚入视频监控行业的菜鸡2090741348 8781

基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】

比如想在识别到的现实物体上叠加虚拟物体,需要知道这个现实物体在 Unity 的世界坐标下的哪个位置,是带有 x,y,z 三个轴的数据的。而 WebCamTexture 捕捉到的图像只是个 2D 的平面,没有三维世界的深度信息,我们通过物体识别算法识别到的物体坐标只是在这个 2D 平面上的一个屏幕坐标,可以理解为 Quest 拍摄了一张照片,我们识别到这张照片上的某个像素点为需要识别的现实物体的中心。是不是看起来比较复杂?Quest 的相机访问功能是在安卓的。

qq_46044366的博客 2104

VMware + ubuntu20.04 + qemu安装

遇到报错可参考:(从ubuntu裸系统开始安装)

NosONE 3230

Android NDK开发: 通过C/C++调用第三方so库

上一篇打包so库及jar包的博客我讲了如何将自己的代码打包成so库,并且配合jar包供他人调用。但那种方式仅适合对方从java层调用,如果算法是比较核心的,而又为了效率必须从native来调用,那种方式就不合适了。本篇讲如何打包我们自己的核心代码供他人在native调用,如果对方愿意,也可以自己封装然后从java来调用,灵活性更高。并且在调试的时候更加方便。这种方式是更接近纯C/C++工程的集成...

zuguorui的专栏 1万+

青藏高原冻土数据实战:如何用QGIS分析1961-2020年冻土退化趋势(附完整操作步骤)

本文详细介绍了如何使用QGIS分析1961-2020年青藏高原冻土退化趋势,包括数据准备、预处理、时空分析和模型验证等全流程操作。通过TTOP模型和Stefan方程,揭示了冻土退化的空间差异和海拔依赖性,为环境研究提供科学依据。

weixin_29276847的博客 127

Android Studio引入ndk编译的so库, 通过jni给Java程序使用

工作要求将一个C++老项目的函数用ndk打包成库给安卓同事的java程序调用。自己之前从来没接触过安卓开发,问了老板为什么不让安卓开发来干,老板说安卓开发不懂c++,公司就我一个是懂c++的。。。项目开发年限超过十年,只在32位系统编译过,一些32位可以通过的代码到了64位就不行了,很多的库多少有些兼容问题项目开发环境全程断网,给开发带来诸多不便NDK:Native Development Kit,是 Android 的一个工具开发包。

Tracker647的博客 2043

使用TensorFlow搭建FNN(全连接神经网络)的基本步骤

提示:转载请注明出处,若本文无意侵犯到您的合法权益,请及时与作者联系。 目录 一、定义神经网络的输入输出 二、搭建神经网络 1、定义一个神经层中的权重 2、定义一个神经层中的阈值 3、定义一个神经层中的激活函数 4、组合神经层为神经网络 三、搭建损失函数和优化器 1、搭建损失函数 首先介绍第一个函数这其中用到的共同的函数为 2、定义优化器 四、训练神经网络 全连接神经网络的网络结构如下: 一、定义神经网络的输入输出 神经网络最擅长的工作就是模拟非线性函数,即一个复杂的高..

qq_41959920的博客 4070

13、7自由度机械臂混合逆运动学算法解析

本文介绍了一种针对7自由度机械臂的混合逆运动学算法,通过引入额外参数Φ解决冗余自由度问题,并实现了避障、避免关节超限和扩大工作空间。该方法采用解析逆运动学求解策略,克服了机械臂在奇异位姿时的配置不连续性问题。通过对比实验验证了该算法在腕部关节角度连续性和位姿可达性方面的优越性,同时结合躯干逆运动学显著扩展了机械臂的工作空间。

rgv23456789的博客 236

Android NDK 集成调用第三方SO库(标准SO库和非标准SO库)

想要进阶高级Android开发工程师,NDK开发是必须要掌握的技能之一,本文以集成第三方SO库为开端,带大家入门NDK开发,主要包含一下内容:1、NDK工程创建;2、编写和打包Android标准SO库;3、集成Android标准SO库;4、集成Android非标准SO库。

sziitjin的博客 2733

【数据集】中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

WW、forever的博客 2595

android studio ndk-build 编译C生成.so文件(ndk基础篇)

一、概要 最近项目需要,要把代码中加密的部分打包成so文件,刚开始接触的时候真是痛苦呀,网上好多资料,都不是很详细,步骤也不清晰,所以我整理了一下,希望大家喜欢。 现在android studio打包so文件有两种方式,第一种是ndk-build编译项目,还有一种用CMake脚本构建项目,今天主要介绍ndk-build的编译过程 二、ndk-build 构建过程 1,下载NDK和构建...

诚(cheng)的博客 3万+

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2885

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: Android NDK : NDK开发概要
下一篇: Android NDK : 基本类型,字符串与数组
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值