`

Android如何调用第三方SO库

阅读更多

问题描述: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文件如下:

 

LOCAL_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.jar  
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so  
LOCAL_MODULE_TAGS := optional  
include $(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中

 

GRANDFATHERED_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调用第三方so库

    这篇内容将深入探讨如何在Android应用中调用已编译的第三方.so库,以实现Java与C/C++之间的交互。 首先,了解JNI(Java Native Interface)是关键。JNI是Java平台的标准组成部分,它允许Java代码和其他语言写的代码...

    调用第三方so库文件

    标题中的“调用第三方so库文件”涉及到了Android应用程序与本地代码(Native Code)的交互,主要通过Java Native Interface(JNI)来实现。下面将详细阐述这一过程及其相关知识点。 1. **JNI简介**: JNI是Java...

    Android CMake调用第三方库

    本文将深入探讨如何使用Android CMake调用第三方库,并以自定义`StringUtil`库为例,讲解NDK-Build编译生成多平台SO(Shared Object)文件的过程。 首先,我们需要了解CMake的基本概念。CMake是一个跨平台的开源...

    Android通过JNI调用.so动态库

    Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...

    andoid studio中JNI调用第三方库例子

    这个例子"android studio中JNI调用第三方库例子"是基于谷歌官方提供的"hello-libs"示例项目,旨在帮助开发者了解如何在Android Studio中使用JNI来调用预编译的第三方动态链接库(.so文件)。 首先,我们需要理解JNI...

    android调用第三方库,博客中helloword实例,请去看博客

    在Android开发中,调用第三方库是常见的操作,这能够帮助开发者快速实现复杂的功能或接入新的服务。在本实例中,我们将关注如何在Android应用中使用JNI(Java Native Interface)来调用C/C++编写的第三方库。JNI是...

    Android调用第三方的so

    Android调用第三方的so,简单开发的配置mk文件,然后和调用代码测试

    通过JNI调用第三方动态库(生成两个.so文件)

    通过JNI调用第三方动态库在Android开发中是常见操作,涉及到的知识点包括Java本地方法声明、JNI接口定义、Makefile编写以及NDK编译。在实际操作过程中,务必注意代码的正确性,因为一个小错误都可能导致编译失败或...

    android调用第三方库,博客中hello实例,请去看博客

    综上所述,Android调用第三方库,尤其是通过JNI进行C/C++代码的集成,是一个涉及到Android NDK、JNI接口定义以及本地库管理的重要技术实践。通过理解和熟练掌握这一技术,开发者可以充分利用C/C++的优势,提升应用...

    简单jni实例调用第三方.so库

    本实例将探讨如何通过JNI在Java应用中调用第三方的.so库。 首先,我们需要理解JNI的工作原理。JNI接口提供了Java虚拟机(JVM)与本地代码之间的桥梁。当Java程序调用一个声明为`native`的方法时,JVM会查找对应的...

    安卓NDK调用第三方动态库方法实例

    本实例主要探讨的是如何在Android项目中使用NDK调用第三方动态库,即.so文件。 首先,理解NDK和JNI的概念至关重要。NDK是一组工具,可以帮助开发者编写原生代码,并将其集成到Android应用中。JNI则是Java平台标准的...

    android调用第三方库,博客中helloword2实例,请去看博客

    在Android开发中,调用第三方库是常见的需求,特别是在实现特定功能或优化性能时。本实例将探讨如何在Android项目中使用JNI(Java Native Interface)技术来调用第三方C/C++库,以此作为"HelloWord2"的一个示例。在...

    qt-android调用静态库和动态库例子

    在Android平台上进行Qt开发时,有时我们需要调用C++库来扩展功能,这些库可以是动态库(.so文件)或静态库(.a文件)。本文将深入探讨如何在Qt项目中集成和调用这两种类型的库。 首先,理解动态库与静态库的区别是...

    Android Studio使用第三方so库时编译 demo

    本篇将详细介绍如何在Android Studio中使用第三方so库进行项目编译。 首先,了解JNI。JNI是Java和本地代码(如C/C++)交互的一个桥梁,它允许Java代码调用本地方法,同时本地代码也能调用Java方法。在Android中,...

    使用cmake来在Android studio中调用三方so文件

    在Android开发中,有时我们需要集成第三方库,这些库可能包含C或C++代码,以提供高性能的计算或者访问特定硬件功能。在这种情况下,Android Studio支持使用CMake(跨平台的构建系统)来编译和链接这些本地代码,生成...

    JNI调用第三方动态库

    本教程将深入探讨如何在Android平台上通过JNI调用第三方动态库。 1. **JNI基础** - **JNI接口定义**:JNI接口定义了Java和本地代码之间的桥梁,包括函数指针类型、数据类型转换以及方法ID和类ID的概念。 - **本地...

    JNI挂接第三方so库

    JNI挂接第三方so库(androidstudio) 最近在做一个项目,需要挂接其它部门提供的so库,android纯小白,在网上找了一堆资料,走了很多弯路终于初步挂接成功,整个流程给大家分享一下 基本工具 androidstudio,google...

    android开发JNI调用三方.so的demo

    本教程将详细介绍如何在Android开发中使用CMake添加并调用第三方.so库。 首先,了解JNI的基本概念。JNI是Java平台提供的一种接口,它允许Java代码调用本地(即非Java)代码,反之亦然。JNI已经成为Android系统与C/...

    Delphi开发Android程序调用wxSqlite3编译的so文件

    这里包含编译好的支持加密的so库,支持128位AES,以及Delphi调用需要的文件和示例,这个源码没有充分测试,如有问题就在我的博客上留言。资源分没有办法更改为0,请大家多担待一下,本想免费给大家的,以前是可以不...

    android 自定义so库使用与方法调用demo

    在Android开发中,有时我们需要利用C或C++的高效计算能力来处理一些复杂的运算或集成第三方库,这时就需要使用到Android的本地开发包(Native Development Kit,简称NDK)。本教程将详细介绍如何创建并使用自定义的...

Global site tag (gtag.js) - Google Analytics