Android如何调用第三方SO库

Android Studio中的Android项目调用第三方库so库 Android NDK开发中,除了可以通过自己编写C/C++代码来构建动态连接库进行调用之外,还可以通过直接调用现成的so库开进行NDK开发。接下来,我将介绍在Android Studio中如何调用第三方动态连接库。    首先需要考虑的是如何获得so库文件,这里介绍自己编译生成的方法。     在该项目的基础上http://blog.youkuaiyun.com/sinat_19385391/article 阅读详情
问题描述:Android如何调用第三方SO库;
已知条件: SO库为Android版本连接库(*.so文件),并提供了详细的接口说明;
已了解解决方案:
1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;
2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库;
求解:
1.上面两种方案是否可行?不可行的话存在什么问题?
2.两种方案有什么区别?为什么网上大部都是用的第二种方案?
3.只有一个*.so文件,并提供了详细的接口说明,是否可在ANDROID中使用它?

首先要看这个SO是不是JNI规范的SO,比如有没有返回JNI不直接支持的类型。也就是说这个SO是不是可以直接当作JNI来调用。如果答案是否定的,你只能选第二个方案。

如果答案是肯定的,还要看你是不是希望这个SO的库直接暴露给JAVA层,如果答案是否定的,你只能选第二个方案,比如你本身也是一个库的提供者。

一般如果你只有SO,就说明这个是别人提供给你的,你可以要求对方给你提供配套的JAVA调用文件。

1、这个要看这个SO是不是符合JNI调用的规范。还要看你自己的意愿。
2、因为第二种方法最灵活,各种情况都可以实现。
3、可以

看能不能直接从JAVA调用的最简单的方法就是看SO里的函数名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己写一个配套的JAVA文件,注意一下SO函数名和JAVA函数名的转换规则,或者向SO提供方索要;
不是的话就选第二种方案吧。

1、检查所需文件是否齐全
使用第三方动态库,应该至少有2个文件,一个是动态库(.so),另一个是包含
动态库API声明的头文件(.h)
2、封装原动态库
原动态库文件不包含jni接口需要的信息,所以我们需要对其进行封装,所以我
们的需求是:将libadd.so 里面的API封装成带jni接口的动态
3、编写库的封装函数libaddjni.c
根据前面生成的com_android_libjni_LibJavaHeader.h 文件,编写libaddjni.c,用
来生成libaddjni.so

Android中可能会用到第三方的软件包,这包括Java包.jar和Native包.so。jar包既可通过Eclipse开发环境集成,也可通过编译源码集成,看你的工作环境。

假定自己开发的程序为MyMaps,需要用到BaiduMaps的库,包括baidumapapi.jar和libBMapApiEngine_v1_3_1.so。

一、Eclipse中集成第三方jar包及.so动态库

MyMaps工程下创建目录libs以及libs/armeabi,把baidumapapi.jar放在的libs/目录下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。

Eclipse中把第三方jar包baidumapapi.jar打包到MyMaps的步骤:

1. 右击工程,选择Properties;

2. Java Build Path,选择Libraries;

3. Libraries页面点击右面按钮“Add Library…”;

4. 选择“User Library”,点击“Next”;

5. 点击“User Libraries”按钮;

6. 在弹出界面中,点击“New…”;

7. 输入“User library name”,点击“OK”确认;

8. 返回之后,选择刚刚创建的User library,右面点击“AddJARs”;

9. 选择MyMaps/libs/下的baidumapapi.jar;

10. 确认,返回。

这样,编译之后,该jar包就会被打进MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。

程序运行过程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,加载动态库时系统会从程序的该lib/目录下查找.so库。

二、源码中集成第三方集成jar包及.so动态库

Android源码中MyMaps放在packages/apps下。MyMaps下创建目录libs以及libs/armeabi,并把baidumapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。

2.1 修改Android.mk文件

Android.mk文件如下:

[plain] view plain copy
  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_STATIC_JAVA_LIBRARIES := libbaidumapapi
  5. LOCAL_SRC_FILES := $(call all-subdir-java-files)
  6. LOCAL_PACKAGE_NAME := MyMaps
  7. include $(BUILD_PACKAGE)
  8. ##################################################
  9. include $(CLEAR_VARS)
  10. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libbaidumapapi:libs/baidumapapi.jar
  11. LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
  12. LOCAL_MODULE_TAGS := optional
  13. include $(BUILD_MULTI_PREBUILT)
  14. # Use the following include to make our testapk.
  15. include $(callall-makefiles-under,$(LOCAL_PATH))

1 集成jar包

LOCAL_STATIC_JAVA_LIBRARIES取jar库的别名,可以任意取值;

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar库的规则,格式:别名:jar文件路径。注意:别名一定要与LOCAL_STATIC_JAVA_LIBRARIES里所取的别名一致,且不含.jar;jar文件路径一定要是真实的存放第三方jar包的路径。

编译用BUILD_MULTI_PREBUILT。

2 集成.so动态库

LOCAL_PREBUILT_LIBS指定prebuilt so的规则,格式:别名:so文件路径。注意:别名一般不可改变,特别是第三方jar包使用.so库的情况,且不含.so;so文件路径一定要是真实的存放第三方so文件的路径。

编译拷贝用BUILD_MULTI_PREBUILT。

2.2 加入到GRANDFATHERED_USER_MODULES

在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中

[plain] view plain copy
  1. GRANDFATHERED_USER_MODULES += \
  2. … \
  3. libBMapApiEngine_v1_3_1

user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推荐修改$(TARGET_DEVICE_DIR)下的。

2.3 编译结果

MyMaps.apk编译生成在out/target/product/<YourProduct>/system/app/下;

libBMapApiEngine_v1_3_1.so放在out/target/product/<YourProduct>/system/lib/下,这也是系统加载动态库时搜索的路径。

在android里调用第三方动态链接库.so 最近刚接触android,遇到的问题一个接一个;这不是当下要调用联发科的一键配置动态链接库“libIoT_manager_jni.so”, 就遇到了各种错误。 此处先做个笔记:共后期使用 1.调用第三方动态链接库.(so 类型的文件)时,在android的项目的libs文件夹下“新建文件armeabi,将.so库文件搁进去”, 2. 调用库使用方法:System.loadLibrar 阅读详情

相关推荐

android调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

第一篇:主要是介绍从头建立一个hello的工程,这里面创建库libhello.so然后在java程序中调用他,有一个相对来说一气呵成的步骤 第二篇:主要是介绍用android程序直接调用第三方库 第三篇:主要是介绍用android程序整合第三方库到自己的库中, 第四篇:主要介绍android调用多个第三方库时Android.mk的写法和注意事项 在这四篇中,避免枯燥,作者会设置一定的场景,

1万+

Android NDK编译本地文件以及引用第三方so文件

引用第三方的so文件很简单,直接将so文件

zkw12358的专栏 5008

Android so库开发——源码中调用so库(三)

本文详细介绍了在Android系统中集成和使用SO库的完整流程。

小旭的专栏 2340

Android 项目调用第三方库so动态库

在Android NDK开发中,可以通过自己编写C/C++代码来构建so动态库进行调用之外,还可以把so动态库提供给第三方使用;接下来,我将介绍在新创建的Android 项目(或已存在的Android 项目)中如何调用第三方so动态库。关于如何进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库,请查看。

UrasakiNakajima的博客 1万+

SWIPT技术(无线通信携能技术)的简介与架构——(后续补充无人机SWIPT方向)

SWIPT一、SWIPT(无线通信携能)技术简介1.1、组成:1.2、与传统无线通信的区别:1.3、SWIPT 的集成接收器架构设计1、单独的接收器2、TS架构——时间开关(Time switching,TS)3、PS架构——功率分流(Power splitting,PS)4、天线开关接收器主要两种架构的区别参考文献SWIPT的发展 一、SWIPT(无线通信携能)技术简介 SWIPT(Simultaneous Wireless Information and Power Transfer )是各种WPT技术

Blue 1万+

智能解决装箱问题:使用优化算法实现高效包装

装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。

MindOpt_003的博客 5539

Android SO文件保护加固——加密篇(一)

这篇是一系列的关于SO文件保护的自我理解,SO文件保护分为加固,混淆以及最近炒的比较火的虚拟机,由于本人菜鸟,无力分析虚拟机,我相信以后会有机会。。。加固就是将真正的so代码保护起来,不让攻击者那么轻易的发现,至于混淆,由于ART机制的介入,使得O-LLVM越来越火,这以后有机会再分析,这次主要是基于有源码的so文件保护,下次介绍无源码的so文件保护,废话不多说,开搞 在这之前首先对elf文

mergerly的专栏 5036

笔记汇总 | 斯坦福 CS229 机器学习

本文为斯坦福大学 2014 秋季 CS229 机器学习课程学习笔记本文主体部分转载自黄海广博士,文末已给出,大家有兴趣可以直接访问笔记首页,下载对应课程资料及作业代码。

ReturnTmp的博客 2461

android studio通过 jni 调用第三方非标准 so库

android studio通过 jni 调用第三方非标准 so库

susu1083018911的博客 2087

Windows下Anaconda换清华镜像源最全指南(含常见问题解决)

本文提供了一份详尽的Windows系统下Anaconda配置清华镜像源的完整指南。针对网络下载缓慢的痛点,文章详细对比了命令行添加与直接编辑配置文件两种主流方法,并重点解决了配置过程中常见的文件缺失、安装失败、环境求解缓慢等疑难问题,帮助用户一劳永逸地提升包管理效率。

brandy的博客 337

一文搞懂【Linux 搭建 Dread Hunger 服务器】附本体及Docker部署集群方案

看直播发现了五花八门的开服器和版本,一时兴起按官方文档进行了搭建尝试,所以我的版本基于官方Stream2024.01.10更新的版本,也就是停服时的玩法,应该可以根据mod和补丁魔改成更那些开服器一样的版本,本文不做谈论,注重服务器搭建,毕竟8个人不可能在一个局域网里乱象:首先,我看了大量教程视频,一类是开服器的推广,另一类自建的基本采用Windows搭建,我觉得最离谱的是大部分教程都会教你买一台远程Windows虚拟机???

LHmine的博客 3983

android studio jni 调用 第三方 非标准 so库

文章目录1、简介2、先编译出一个第三方非标准so库1)android studio 新创建一个项目2) main 新创建 jni 文件夹3) 新建 .cpp 文件和 .h 实现 求和功能4)、编写 CMakeLists.txt 用来编译 cpp 文件到so5)配置编译环境6)、编译第三方 非标准 库3、新项目 引用第三方 so 库1)新建 android studio 项目2)新建 java 类,封装想要调用的接口函数3)Main 文件夹新建 jniLibs 文件夹4)创建 对应的 jni java 类

Venus 的博客 5283

AUTOSAR RTE配置实战:从ECU分区到Task映射的完整指南

本文提供了一份AUTOSAR RTE配置的完整实战指南。从创建ECU分区、定义OS任务,到实现Runnable Entity与Task的精确映射,详细解析了每一步的操作要点与常见陷阱。文章结合配置工具界面,旨在帮助开发者高效完成RTE配置,确保系统实时性与数据一致性,是掌握AUTOSAR核心开发流程的实用参考。

weixin_29228203的博客 484

Android Jni(二)加载调用第三方 so 库

记录一些遇到的问题

三月的船长 1743

智能体在车联网中的应用:第9天 核心工具链与仿真世界:SUMO交通仿真入门——从安装到构建你的第一个虚拟十字路口

摘要 SUMO是一款开源微观交通仿真工具,为车联网和自动驾驶算法开发提供高效安全的测试环境。文章详细介绍了SUMO的核心概念、安装方法及实战应用。在Ubuntu或Windows系统安装SUMO后,可通过netedit工具构建十字路口路网,包括创建节点、连接边、设置交通信号灯等步骤。随后通过编写.rou.xml文件定义车辆类型、路线和车流,实现动态交通场景模拟。SUMO支持与外部程序交互,能复现真实场景、进行极端测试和算法验证,是车联网研究的理想数字沙盘。

IT深耕十余载,大道之简 1450

华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go)

华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。

qq_45776114的博客 1793

Eclispe及利用Android.mk调用第三方so库及jar包

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

vane918的博客 739

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 调用第三方so库

首先要知道这个第三方的so库是不是按jni标准写的,如果是那就简单了,直接写个native调用就行了。如果不是那就比较麻烦了,必须要把这个so库里面的函数封装一下在调用,下面进入正题。假设这个库放在/system/vendor/lib下面,名字为libtest.so,我们要调用的方法是get_status,我分别列出在第三方的app和framewok怎样调用。首先是在第三方app的调用,这里的核心...

jueme的博客 7764

IEM模型,地表粗糙度模拟

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

RK3288 基于安卓调用第三方so库

有时候我们会需要使用第三方的so库。 但是我们在使用的时候,看不到源码。只能根据库的提供者,提供的信息来使用这个库。 我们需要知道库的接口,和库里面的包名。 今天我们调用一个第三方的驱动库,主要是用IIC驱动Terawins的图像处理芯片T613。 首先库的接口如下: package com.t613.t613_demo; /** * Created by Administrato...

shao15232的博客 652

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android jni调用第三方so库和.h文件

Android利用cmake调用第三方so库配合.h文件,进行so库第二次封装 1.将第三方库复制至JniLibs目录下 2.将头文件复制head目录下 3.在cmake目录下添加第三方库 cmake_minimum_required(VERSION 3.4.1) # Creates and names a library, sets it as either STATIC # or SHAR...

拼命折腾的小白 3430

Android开发 JNI-调用第三方so库

本文介绍了Android开发中调用第三方so库的具体操作步骤,常见错误,以及完整的验证流程,仅供参考。

qq_34629725的博客 652

Android中引用第三方so库并在cpp中调用

在项目或者模块的libs文件夹下新建对应ABI的文件夹我这边创建arm64-v8a文件夹并将so库放入其中。将include文件夹复制到项目或者模块的src/main/cpp文件夹下。下面贴出完整的CMakeLists.txt用于参考。

SilverIceKnife的博客 1229
上一篇: 浅谈HTTP中Get与Post的区别
下一篇: ubuntu 下mysql不能进行远程连接
hellochenlian
博客等级 码龄17年 629粉丝 295原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值