NDK开发(六):Android如何调用第三方SO库

在android里调用第三方动态链接库.so 最近刚接触android,遇到的问题一个接一个;这不是当下要调用联发科的一键配置动态链接库“libIoT_manager_jni.so”, 就遇到了各种错误。 此处先做个笔记:共后期使用 1.调用第三方动态链接库.(so 类型的文件)时,在android的项目的libs文件夹下“新建文件armeabi,将.so库文件搁进去”, 2. 调用库使用方法:System.loadLibrar 阅读详情
问题描述: 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.    
  4. LOCAL_MODULE_TAGS := optional  
  5.    
  6. LOCAL_STATIC_JAVA_LIBRARIES := libbaidumapapi  
  7.    
  8. LOCAL_SRC_FILES := $(call all-subdir-java-files)  
  9.    
  10. LOCAL_PACKAGE_NAME := MyMaps  
  11.    
  12. include $(BUILD_PACKAGE)  
  13.    
  14. ##################################################  
  15. include $(CLEAR_VARS)  
  16.    
  17. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libbaidumapapi:libs/baidumapapi.jar  
  18. LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so  
  19. LOCAL_MODULE_TAGS := optional  
  20. include $(BUILD_MULTI_PREBUILT)  
  21.    
  22. # Use the following include to make our testapk.  
  23. 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 studio中NDK开发(二)——使用CMake引入第三方so库及头文件 一、前言 通常来说,第三方提供的so库以及头文件都没有没有引入jni.h头文件。所以我们在导入第三方so库以及头文件的时候需要手动的将其关联到官方的native-lib库中,关联成功后就可以在native-lib中include进第三方头文件,引进头文件成功后就可以在自定义的JNI接口中对第三方头文件中内容进行调用。 二、准备 第三方so库以及头文件 创建一个默认的NDKDemo(可按照CMak... 阅读详情

相关推荐

Android Studio NDK开发并调用so库

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

FZeroTHero的博客 2894

Android如何调用第三方SO库

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

hellochenlian的专栏 3万+

Android Studio中的Android项目调用第三方库so库

Android NDK开发中,除了可以通过自己编写C/C++代码来构建动态连接库进行调用之外,还可以通过直接调用现成的so库开进行NDK开发。接下来,我将介绍在Android Studio中如何调用第三方动态连接库。    首先需要考虑的是如何获得so库文件,这里介绍自己编译生成的方法。     在该项目的基础上http://blog.youkuaiyun.com/sinat_19385391/article

sinat_19385391的博客 2万+

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

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

zkw12358的专栏 5008

Android so库的编译

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

nanke_yh的博客 1787

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

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

DikY_的博客 5308

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

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

UrasakiNakajima的博客 1万+

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

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

小旭的专栏 2340

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

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

zuguorui的专栏 1万+

Android so库开发——Android Studio调用so库(二)

在中已经创建了自己的so库,这是一个JNI规范的so库,可以直接将so库放到libs中,并按照上面文章中MainActivity中的调用方法使用。1、build.gradle(app)配置2、加载so库中方法在Sudio中方法名虽然显示红色,但不影响使用。3、Activity中调用方法。

小旭的专栏 8027

从DIY到实战:手把手教你搭建一个媲美吉时利2450的nA级电流源表(附原理图与避坑指南)

本文详细解析如何从零打造nA级精密电流源,涵盖核心设计原理、PCB布局技巧、热电偶效应应对及校准验证体系。通过低成本替代方案和优化设计,实现媲美商用源表的性能,特别适合硬件爱好者和独立开发者。文章还提供原理图与避坑指南,助你轻松搭建高精度电流源系统。

weixin_42656416的博客 290

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

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

zuguorui的专栏 1万+

论文阅读4——一种宽频带圆极化微带天线的设计

论文阅读——一种宽频带圆极化微带天线的设计(现在才觉得开始弄懂了一点,懂了一点之后又更糊涂了……)

weixin_64612422的博客 2315

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

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

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

一生一芯——用RTL实现最简单的处理器NPC(南大数逻计组RV32ICPU) 代码及思考参考

本文介绍自己前期用Verilog编写的基于RV32I指令集的CPU,个人认为是最简单最易懂的版本(即没做什么优化,即代码很水,没有考虑一些奇怪的情况,只适用简单指令序列,即题目所示最简单的处理器),适合新手练手Verilog以及了解简单CPU的运行过程。本文基于一生一芯,利用Verilator进行仿真,并用gtkwave查看波形,不了解verilator和gtkwave的可以看前几篇文章。

long0_o的博客 3307

一起玩转GNU Radio:调制解调大合集

本文汇总了GNU Radio中多种常见的调制解调方法及其参考文献链接,便于今后查看,供大家参考!

无线通信实验室 1万+

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

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

sziitjin的博客 2733

Replay音频转换时samplerate缺失的解决方案指南

Replay音频转换时提示"No module named 'samplerate' This error is lazily reported, having originally occured in File"的解决方案

weixin_47445543的博客 2127

Android之NDK开发入门

注意:本文操作环境为mac,Android Studio版本3.5 前言 NDK全称Native Development Kit,是Android的一个工具开发包,能够快速开发C,C++的动态库,并自动将so和应用打包成APK。而NDK的使用场景就是通过NDK在Android中使用JNI,那么JNI又是啥呢?JNI全称是Java Native Interface,即Java的本地接口,JNI可以使得Java与C,C++语言进行交互。这么一来,通过NDK和JNI,就可以很方便的在Android的开发环境中.

jsyjst的博客 8034

DFI协议时序

参数名称典型值应用场景关键影响tcmd_lat1-2个时钟周期命令与地址锁存同步地址错误风险tphy_wrlat1-2个时钟周期写操作响应速度写带宽与延迟2-3个时钟周期写操作端到端延迟系统吞吐量1-2个时钟周期连续写命令间隔信号干扰与资源冲突tphy_rdlat1-2个时钟周期读操作响应速度读带宽与延迟trddata_en由CL决定(如0.41 ns)读数据返回时间系统延迟10-20 ps写数据与命令对齐数据丢失风险<1 µs低功耗模式切换。

qq_43134430的博客 5101

Coze智能体实战:接口需求分析和接口调试

AI智能体的需求:能根据接口文档提取接口信息以及设计接口测试点,并进行接口调试返回接口测试结果。

十二测试录 282

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

一文吃透 SAP HANA SDA:把分散数据当作本地数据来用的那把钥匙

摘要:SAP HANA SDA(Smart Data Access)技术详解:150字精要 SAP HANA SDA是一种数据虚拟化技术,允许在不复制数据的情况下访问远端数据源。核心功能包括: 通过Remote Source定义连接配置 创建Virtual Table作为本地代理 支持谓词下推优化查询性能 与SDI技术协同工作扩展数据集成能力 典型应用场景包括: 跨系统联邦查询 冷热数据分层管理 混合云数据整合 远程表复制(RTR)实现近实时数据同步 实施要点: 需关注适配器能力差异 合理运用查询下推优化

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 318

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

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

知来者逆的博客 3714

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VS2019 C++的跨平台开发——Android .so开发

这篇介绍下怎么用VS开发Android使用的.so动态链接库文件。 Android环境配置 1.先打开VS installer ​ 2.选中C++移动开发​ 3.如果VS没有下载NDK和SDK的,需要在VS里面配置 ​ ​ 我这里用的是Unity下载的NDK,SDK,JDK。路径大概在:Unity\xxxxxxxx\Editor\Data\PlaybackEngines\Andro...

luoyu510183的博客 3万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android开发打开第三方库,Android开发NDK调用三方so库

概要在日常开发中,android NDK的作用无外乎有两种:一种是通过调用底层C/C++的算法,提高app的运行效率;另一种则是通过C/C++的特性,或者和驱动交互等,实现一些功能性的需求。接下来将用详细的步骤,给大家演示一下android ndk调用三方so库的过程。1.NDK环境准备1.1.通过android studio在SDK Tools中安装LLDB、NDK、CMake,如下图:1.2....

weixin_29840475的博客 1540

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: NDK开发(五):Android JNI层实现文件的read、write与seek操作
下一篇: FragmentPagerAdapter与FragmentStatePagerAdapter区别
「已注销」
博客等级 码龄19年 21粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值