Android NDK开发动态加载so示例源码

Android so文件浅析 一. 简述 Android中的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发中。 二. 基础知识 三. so文件格式解析 so文件即ELF文件,是一个二进制文件,我们可以用UltraEdit打开查看。如下: 上面有一处很明显看到,在so文件解析出来的头文件字段是ELF,也印证.so是一个ELF格式的问题。 ELF文件... 阅读详情

度娘搜到这篇博客,Android 动态加载 .SO

博文中只有部分代码,对拷贝so文件至系统目录的接口(

FileUtils.assetToFile(this, "libTestJNI.so", soFile);
)没有实现,搜索一番未得,发在这里给大家测试一下。

源码下载地址:http://download.youkuaiyun.com/detail/mnorst/8065011

package com.example.testtwolib;

import java.io.File;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {

	// 静态加载.so
	// static {
	// //System.loadLibrary("test2");
	// //System.loadLibrary("test");
	//
	// }

	private TextView mTextNum;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mTextNum = (TextView) findViewById(R.id.num);

		// 动态加载.so
		load();
		// load2();

		int z = add(3, 4);
		mTextNum.setText("add=" + z);
	}

	private void load() {

		File dir = getDir("lib", Context.MODE_PRIVATE);
		File soFile = new File(dir, "libtest.so");
		FileUtils.assetToFile(this, "libtest.so", soFile);

		try {
			System.load(soFile.getAbsolutePath());
		} catch (Exception e) {
		}
	}

	private void load2() {

		File dir = getDir("lib", Context.MODE_PRIVATE);
		File soFile = new File(dir, "libtest2.so");
		FileUtils.assetToFile(this, "libtest2.so", soFile);

		try {
			System.load(soFile.getAbsolutePath());
		} catch (Exception e) {
		}
	}

	public static native int add(int x, int y);
}


package com.example.testtwolib;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.content.res.AssetManager;

public class FileUtils {

	public static void assetToFile(Context context, String name, File file) {
		AssetManager assetManager = context.getAssets();

		InputStream is;
		try {
			is = assetManager.open(name);
			java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();

			byte[] bufferByte = new byte[1024];
			int l = -1;
			while ((l = is.read(bufferByte)) > -1) {
				bout.write(bufferByte, 0, l);
			}
			byte[] rBytes = bout.toByteArray();
			bout.close();
			is.close();

			if (!file.exists()) {
				file.createNewFile();
			}

			DataOutputStream dos = new DataOutputStream(new FileOutputStream(
					file));
			dos.write(rBytes);
			dos.flush();
			dos.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (OutOfMemoryError e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}




在命令行下用cmake交叉编译可在android中运行的so包 在命令行下用CMake交叉编译可在android中运行的so包最近在写一个通过录屏生成gif的小应用,由于要用到NDK,所以开始去解这方面的知识,总的来讲也还算简单,不过对于之前从没接触过ndk的小白来说,一切都是需要摸索的,在一个不熟悉的领域有时候一个微小的问题也能让你摸个半天才能搞明白。我写博客的大部分原因就是为了记录下这些摸索的过程,以后要是忘记了还可以翻出来看,当然,要是还能帮到其他跟我一样 阅读详情

相关推荐

Android NDK开发(一)环境搭建及运行示例

NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。 2.NDK提供了一份稳定、功能有限的API头文件声明 Google明确声明该API是稳定的,在后续所有版本中都

m0_70082867的博客 1129

System.load 和 System.loadLibrary详解

System.load 和 System.loadLibrary详解1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。2.System.load 参数为库文件的绝对路径,可以是任意路径。例如你可以这样载入一个windows平台下JNI库文件:System.load("C://Docu

悦峰原创博客 8万+

Android下交叉编译OpenSSL为ARM64动态库的完整指南

在移动应用开发中,保障数据安全传输通常依赖TLS/HTTPS协议,而OpenSSL作为广泛使用的加密库,在Android原生层集成时往往需要针对特定CPU架构定制。交叉编译技术让开发者能够在PC环境下生成ARM64架构的二进制库,解决系统自带BoringSSL不便于直接调用的问题。通过Android NDK工具链,配置环境变量与编译参数,即可产出libssl.so和libcrypto.so动态库,并借助JNI封装供上层调用。本文从交叉编译原理出发,梳理了OpenSSL在Android平台上的编译流程、常见错

weixin_42525632的博客 263

Android基础——动态加载so库

在学习类加载器和动态加载之后,来学习一下so库的动态加载

weixin_44901971的博客 1万+

Android动态注入SO文件技术详解

Android平台支持通过JNI(Java Native Interface)调用C/C++编写的原生代码,以提升性能、复用已有代码或实现底层功能。开发者通过JNI 可以在 Java 与 C/C++之间进行数据交互与函数调用,实现跨语言通信。为了适配不同的CPU架构,Android引入了ABI(Application Binary Interface)概念,常见的ABI包括armeabi-v7a、arm64-v8a、x86_64等。每种架构需要对应版本的.so(共享库)文件。

weixin_35705784的博客 1651

Android NDK开发动态加载so

Android NDK开发动态加载so,采用System.load方法实现

Android NDK动态加载SO库

对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可避免的在开发中遇到各种各样需要用到native的需求,所以so库的动态化可以减少极大的包体积,自从2020腾讯的bugly团队发部关于动态化so的相关文章后,已经过去两年了,相关文章,经过两年的考验,实际上so动态加载也是非常成熟的一项技术了,但是很遗憾,许多公司都还没有这方面的涉略又或者说不知道从哪里开始进行,因为so动态其实涉及到下载,so版本管理,动态加载实现等多方面,我们不妨抛开这些额外的东西,从最本质的so动态加载

金戈鐡馬 1344

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度解析telnet连接失败时端口23不可达的常见原因与解决方案。从快速自查目标地址、端口到服务端排查,涵盖服务状态检查、防火墙配置及安全组设置,并提供进阶诊断工具与抓包分析方法。文章强调telnet协议的安全风险,建议在生产环境中改用SSH等加密协议进行远程管理。

weixin_28323057的博客 394

android ndk 加载so的策略

0. 动态库加载方式: 方法1:在运行时动态链接库, 动态地将程序和共享库链接并让 Linux 在执行时加载库(动态链接,系统加载) 方法2:动态加载库并在程序控制之下使用它们。(动态加载) 动态链接(系统加载):是指在编译应用程序时,使用 -lxxx 来指定需要链接哪个库。此时,应用程序(ELF)中会指明哪些符号未被填充,且放在哪些动态库中。 LD_LIBRARY_PATH则指明动

yuxingxing198812的专栏 4248

MATLAB实战:5步搞定GNSS单点定位解算(附完整代码)

本文提供了一份基于MATLAB的GNSS单点定位实战指南。通过5个核心步骤,详细讲解了如何从卫星坐标和伪距观测值出发,利用最小二乘迭代算法,构建并实现一个完整的单点定位解算器。文章附有完整代码,并涵盖精度评估与结果分析,适合GNSS初学者和MATLAB用户快速上手实践。

a2b3c4d5e的博客 250

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。

weixin_27219587的博客 206

Android 开发中如何动态加载 so 库文件

Android 开发中如何动态加载 so 库文件(转载) 动态加载的优点 静态加载,不灵活,apk 包有可能大。所以采用动态加载 so 库文件,有以下几点好处: 灵活,so 文件可以动态加载,不是绑定死的,修改方便,so 库有问题,我们可以动态更新。 so 库文件很大的话,采用动态加载可以减少 apk 的包,变小。 其实我们常用第三方 so 库,单个可能没问题,如果多个第三方 so 库文件,同时加载可能会出现冲突,而动态加载就能够解决这一问题。 注意路径陷阱 动态加载 so 库文件,并不是说可以

weixin_44715716的博客 3252

哨兵一号数据snap预处理_利用SNAP软件进行Sentinel-1A卫星微波影像的预处理

利用SNAP软件对雷达影像进行预处理,主要包括热噪声去除、轨道文件校正、辐射定标、滤波校正、多普勒地形校正,最终获得入射角和后向散射信息。数据:本次实验所用数据为哨兵一号(Sentinel-1A)干涉宽幅模式(Interferometric Wideswath,IW)下经过多视处理和地距转换的GRD格式产品一般处理流程如下:0 SNAP软件安装软件安装:安装成功后打开SNAP后如图所示:1 数据...

weixin_30000407的博客 1万+

JAVA学习(15)Vs2015+eclipse编译Qt动态库模块

Qt安卓库使用的gunstl动态库。首先用Qt的IDE生成一次安卓项目,拿到他打包的so文件!后面有用用vs2015开发NDK,不需要编写mk文件!如下:设置为STL动态链接,因为Qt库本身是动态STL,如果你用静态,那个叫浪费内存。动态静态一起用很浪费。 设置Qt头文件目录:(Qt安卓只有arm-V7版本 不碍事) 我的代码中只用了QDebug和QString两个类。因此需要加入这两个

瞎捣鼓 1747

发那科机器人弧焊指令实战:从Search指令到组掩码设置的完整避坑指南

本文详细解析了发那科机器人弧焊指令系统的实战应用,从Search指令的正确使用到组掩码设置的避坑技巧。通过实际案例和参数优化建议,帮助工程师提升焊接质量和生产效率,避免常见错误操作。特别针对T2模式示教难题和外部轴协调运动提供了专业解决方案。

weixin_29040367的博客 184

AI Agent Harness与SCADA系统集成

简单来说,AI Agent Harness是Industrial AI Agent的“中央调度室+装备库+知识库+安全网”把不同技术栈、不同部署环境(云/边/端)、不同功能(感知、推理、决策、执行、验证)的“零散Agent”组装成具备特定工业场景能力的Agent Team(如聚合反应根因诊断Agent Team);管理Agent Team的生命周期(创建、初始化、调度、监控、销毁);提供统一的工业多工具调用接口(对接SCADA、MES、PLC、DCS、巡检机器人、数字孪生平台等);内置。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 355

Android NDK开发实战之环境搭建篇(so库,Gemini ai)

音视频安卓开发首先涉及到ffmpeg编译打包,先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。

weixin_50873490的博客 1529

QGis二次开发 —— 5.2、基于qgis搭建离线地图服务并开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

QGis二次开发 —— 5.2、基于qgis搭建离线地图服务并开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

222

android 加载三方so的方法_Android引入动态库so的方法

Android引入动态库so的方法标签(空格分隔): Android so 第三方库为了执行效率,会将一些CPU密集性任务如音视频解码、图像处理等放入到so中,还有也会将程序关键核心部分放入到so中,这样增加了逆向的难度。下面将so引入分成本地和第三方两种类型。本地是指包含有源码的。这是不讲如何编译和Android.mk的编写,主要讲在Android项目中如何引入so。本地so引入本地的so分成三...

weixin_39630771的博客 1363

[QMT量化交易小白入门]-二十八、有了回测年化收益好的策略,如何在QMT量化实盘呢(附python代码解析)

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 2925

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 64位安卓加载32位so,android ndk混合使用32和64位so库的尝试和总结

前言首先要知道,64位的设备是兼容32位so文件的,目前很多主流app都是只在app中放置32位so,目的是减小apk的打包体积,弊端就是在64位设备上运行时不能充分发挥64位cpu的计算能力。但是我们项目没有这么做,而是在app中同时放了32和64位so,导致apk的体积暴增,原因是app中有3D图形加载比较耗cpu,因此在64位设备上运行为了实际体验使用64位的so,而其他功能如mp3转码,p...

weixin_27722377的博客 1537

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android Studio NDK中cpp代码链接第三方动态库libcrypro.so

一. 简介 使用场景:JNI代码中使用libcrypro.so库和libssl.so库,Android Studio版本是3.4.2。 Android系统中提供了libcrypro.so和libssl.so,存在/system/lib目录中,但是在NDK中并没有提供使用该库的头文件和库。不过openssl是开源的,能将其代码编译获得libcrypro.so和libssl.so,并且源码中提供头文件...

Denny_Chen_的博客 1856

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

安卓逆向_6 --- ndk开发jni、jni静态注册、jni_onload动态注册

JNI 全称是Java Native Interface,为Java本地接口,并提供了若干的 API 连接Java层与Native层。JNI 相当于一个桥梁,实现了 Java 和 C++ 之间互相访问调用。 在 Android 进行 JNI 开发时,可能会遇到 couldn't find "xxx.so" 问题,或者内存泄漏问题,或者JNI 底层崩溃问题。Java 层如何调用 Native 方法?Java 方法的参数如何传递给 Native层?而 Native 层又如何反射调用 Java 方法

freeking101的博客 4743

windows下使用cmake和ndk编译android所用动态库.so和静态库.a

不在linux上编译android所用.a和.so,在windows上如何编译呢?  1.准备工作: 1.vs2008,别的版本vs应该也可以,我用的就是2008; 2.cmake,下载个最新的版本,装上,安装好后把bin目录加入环境变量; 3.ndk,最新版本是ndk10了,附上下载地址https://developer.android.com/tools/sdk/ndk/index

zmscs的专栏 8500

android ndk 怎样调用第三方的so库文件。

问题描述:Android如何调用第三方SO库;已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明;已了解解决方案:1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;2.第二种

金焱的博客 1354

Android NDK开发,跨平台构建crypto++动态链接库并部署到Android Stdio中

Android NDK开发,跨平台构建crypto++动态链接库并部署到Android Stdio中 一、基础 需要在AS中安装NDK、CMake,DDLB一般默认与AS一起安装。 CMake与ndk-build不能同时使用(本文使用的是CMake)。 CMake入门可以看这个:CMake 入门实战 | HaHack 安卓官网的部分资料: CMake | Android NDK | Android Developers (google.cn) 配置 CMake | Android 开发者 | A

国科大网安二班的博客 2206
上一篇: Opengl ES 1.x NDK实例开发之六:纹理贴图
下一篇: Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体
mnorst
博客等级 码龄16年 38粉丝 76原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值