问题描述: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中集成第三方软件包(.jar, .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 plaincopyLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_LIBRARIES := libbaidumapapi

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := MyMaps

include $(BUILD_PACKAGE)

##################################################include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libbaidumapapi:libs/baidumapapi.jarLOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.soLOCAL_MODULE_TAGS := optionalinclude $(BUILD_MULTI_PREBUILT)

# Use the following include to make our testapk.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 plaincopyGRANDFATHERED_USER_MODULES += \… \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 ndk 怎样调用第三方的so库文件。相关推荐

  1. android ndk 编译选项,Android NDK 对于c++的支持(mk文件内编译选项)

    2019独角兽企业重金招聘Python工程师标准>>> 一   Android ndk  支持c ++标准库文档,阉割很多c++  stl特性 C++ support with th ...

  2. Android Studio项目调用第三方库iconv

    iconv动态库编译请参考:ubuntu-20.04.4环境下ndk-r21e 编译libiconv libiconv-1.16动态库下载:Android libiconv.so动态库 一.创建and ...

  3. android 静态编译链接,Android NDK:使用预编译的静态库链接

    我正在尝试将Jnetpcap移植到Android,以便将其用于解析.pcap文件.Jnetpcap是libpcap的java包装器,它使用JNI.我已经使用android的源代码树将libpcap编译 ...

  4. Android NDK 字符编码转换及icu库ucnv_convert函数不同版本的统一使用方法

    一.ICU4C及ucnv_convert概述 如果是在java层,有String类可以很好的转换各种编码,在ndk下面就没有现成的公开的工具,不过可以用icu4c. ICU4C 是IBM的国际化开发组 ...

  5. Android仿微信调用第三方地图应用导航(高德、百度、腾讯)

    好久没有写Andorid代码啦!最近刚好要实现一个这个功能,顺便就在博客里分享一下. 实现目标 先来一张微信功能截图看看要做什么 其实就是有一个目的地,点击目的地的时候弹出可选择的应用进行导航. 大脑 ...

  6. Android仿高德地图app,Android仿微信调用第三方地图应用导航(高德、百度、腾讯)...

    好久没有写Andorid代码啦!最近刚好要实现一个这个功能,顺便就在博客里分享一下. 实现目标 先来一张微信功能截图看看要做什么 其实就是有一个目的地,点击目的地的时候弹出可选择的应用进行导航. 大脑 ...

  7. android so abi适配,Android NDK学习(六): so文件兼容之abiFilters的使用

    最近项目中遇到了要使用JavaCV的情况,涉及到了abi兼容的选择.因为如果全部都适配的话,包很大,这样兼容那些用户数极少的cpu就很不划算,所以我只适配了armeabi-v7a这一个.但是今天在x6 ...

  8. arduino安装第三方开发板库文件

    Arduino作为一个开源硬件项目,目前官方支持的产品线已经非常丰富了,从最开始的8位AVR芯片扩展到多种32位arm芯片,以及内嵌linux的soc等等.同时arduino也支持第三方厂商以认证方式 ...

  9. Android NDK学习(六): so文件兼容之abiFilters的使用

    最近项目中遇到了要使用opencv的情况,涉及到了abi兼容的选择.因为如果全部都适配的话,包很大,这样兼容那些用户数极少的cpu就很不划算,所以我只适配了armeabi-v7a这一个.但是今天在x6 ...

  10. android ndk如何安装,android NDK安装

    Android NDK 是运行于Android 平台上的Native Development Kit 的缩写.Android 应用开发者可以通过NDK 调用C 或C++ 本地代码. NDK的作用: 1 ...

最新文章

  1. CVPR2020:点云分类的自动放大框架:PointAugment
  2. 敏捷之父Martin Fowler作序推荐《演进式架构》
  3. 下载python后怎样打开-下载python后如何启动
  4. C++中的new和delete操作符重载
  5. Java网络编程的简单应用 例程
  6. logstash通过kafka传输nginx日志(三)
  7. Apache Cordova介绍
  8. linux常用命令-第一篇
  9. github+hexo搭建博客(一)
  10. 基于J2EE的网上购书系统(SSM框架)
  11. 一招教你表格里面给方框内打勾
  12. 金三角图形c语言,升哥学堂 | 实战均线形态——“金三角”
  13. Bmob后端云实现无后端开发APP
  14. SpringBoot在使用测试的时候是否需要@RunWith?
  15. 今天才发现!通过微信左下角,还可以快速找到未读消息
  16. 数据分析师有哪些等级
  17. PyTorch1.12 亮点一览 | DataPipe + TorchArrow 新的数据加载与处理范式
  18. html渐变轮播,html简单的渐变轮播插件
  19. 历史最全自然语言处理测评基准分享-数据集、基准(预训练)模型、语料库、排行榜
  20. 计算机会计模块考试,会计职称计算机考试模块windowsxp考试试题.doc

热门文章

  1. 游戏开发物语方案点数分配_《游戏开发物语》官方超全新手攻略和名词解析!...
  2. 立志让国内用户不再依赖国外DLP技术 天空卫士发布UCS新品
  3. 尚学堂JAVA基础学习笔记_1/2
  4. 日常使用计算机如何进行病毒防范,电脑日常生活中怎么防范电脑病毒
  5. 缓存和数据库刷新的顺序 及阿里OCS介绍
  6. Ubuntu压缩文件的分卷压缩和解压
  7. 解决可以上QQ,但是无法上网的问题
  8. arm嵌入式系统C语言代码,ARM嵌入式系统C语言编程.pdf
  9. 微软宣布446亿美元收购雅虎
  10. 图像压缩编码和解码原理——阐述了DCT变换的实质