`
lvwz2008
  • 浏览: 28691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

加载第三方so

 
阅读更多

将so打包进apk ,网上常见的就是 在源码中有c代码,编译出一个so,然后打进apk,也是网上大家转来转去的那几篇文章,因为一致只做纯java开发,这种方法没有试过。

 

如果是第三方so ,则有诸多麻烦。

一种就是 其他同事现在的方法,在eclipse开发,那么libs/armeabi下的so 自动弄进去了,真是简单又方便。

另外一种就是要把so拷贝到编译环境的某个目录,在编译代码时整合进去。

 

 

客户方给了一个so,不知道开发细节,需要编进去。我习惯了在代码树下开发,刚开始并没有注意配置so,结果编译正常,安装正常,但是一旦 loadLibary ,就exception: load library renturn null。

解压发现apk发现,里面并没有源码对应的libs/armeabi/xxx.so,看来并没有打包进去。

在纠结中实战,找到如下实用方法;

 

1  copy 你的so 到out/target/product/generic/system/lib 。 这个目录是你没有修改过TARGET_PRODUCT的情况下。

   如果你的TARGET_PRODUCT是 XXXYYY,则要去out/target/product/XXXYYY/system/lib 。

 

ps:这一步其实可以在第二步中的mk文件中用代码执行,同事给的参考为:

 

  $(shell mkdir -p $(TARGET_OUT)/../obj/STATIC_LIBRARIES/$(LOCAL_MODULE)_intermediates )

 

$(shell cp $(LOCAL_PATH)/lib/libmap-encrypt.a  $(TARGET_OUT)/../obj/STATIC_LIBRARIES/$(LOCAL_MODULE)_intermediates/$(LOCAL_MODULE).a)

 

晚上回去试一试。

 

 

2 在app代码中创建mk文件,文件名可随意,但建议和so同名吧 。  格式如下:

 

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

 

LOCAL_MODULE_TAGS := optional

 

LOCAL_MODULE:= libmupdf

 

 

红色的libmupdf是你要加载的so名称,也就是out/target/product/generic/system/lib下的so名称。

一个so对应一个mk,我们习惯把n个mk放在jni目录下。这个jni目录与app的android.mk 同级。

 

3 在app的Android.mk中 需要有这样的声明

 LOCAL_JNI_SHARED_LIBRARIES := libmupdf ,libmupdf为第二步中声明的LOCAL_MODULE如果是多个 ,用空格隔开

 

还有这一句:

include $(call all-makefiles-under,$(LOCAL_PATH))

 

 

 

4 这样编译后,即使你的源码中没有so,在生成的apk会自动建eStore.apk_FILES/lib/armeabi ,下面便是你想加载的so,只可能是第一步中的目录拷贝而来。

 

5 install -r 时可能报 INSTALL_FAILED_DEXOPT 。 原来在模拟器下开发,/data太小,  重新启动模拟器加  wipe-data 解决。

 

 

 

这个问题是解决了,但是对Android.mk的语法并不了解。以后遇到此类问题,估计还要纠结 ,555

 

有时间学习学习去

 

 

 

 

分享到:
评论

相关推荐

    UE4 4.15 加载第三方dll so

    本教程将详细讲解如何在UE4 4.15版本中加载第三方的DLL(动态链接库)文件以及SO(在Android系统上的共享库)文件,以便调用其中的特定函数,例如`arwIsRunning`,在Windows和Android平台上实现跨平台功能。...

    调用第三方so库文件

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

    android调用第三方so库

    在Android开发中,有时我们需要利用C或C++编写性能高效的代码,这时就需要引入第三方的.so库。这篇内容将深入探讨如何在Android应用中调用已编译的第三方.so库,以实现Java与C/C++之间的交互。 首先,了解JNI(Java...

    android如何增加第三方so和jar

    Android 如何增加第三方 SO 和 JAR Android 作为一个流行的移动操作系统,如何在其上增加第三方 SO 和 JAR 是一个非常重要的问题。SO 文件和 JAR 文件是 Android 应用程序中常用的第三方库,用于提供特殊的功能和...

    cocos2dx使用第三方so库

    ### 使用Cocos2dx集成第三方.so库详解 #### 一、引言 在游戏开发过程中,经常需要使用到各种第三方库来实现特定的功能或者优化性能。对于基于Cocos2dx的游戏开发而言,集成第三方的.so动态链接库是常见的需求之一。...

    使用qt creator如何加载.so库来调用其中的api函数.zip

    在使用Qt Creator进行软件开发时,有时我们可能需要利用第三方提供的动态链接库(.so文件,Linux下的动态库,对应Windows下的.dll)。本教程将详细解释如何在Qt Creator中加载.so库并调用其API函数。 首先,确保你...

    Android Studio 导入第三方库中so文件的导入方法

    Android Studio 导入第三方库中的 so 文件的导入方法 Android Studio 是一个功能强大的集成开发环境(IDE),广泛应用于 Android 应用程序的开发中。然而,在使用 Android Studio 时,需要将第三方库中的 so 文件...

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

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

    Android Studio工程引用第三方so文件的方法

    2. 接下来,我们需要在 src/main 目录下创建一个 jniLibs 目录,并在其中添加第三方 so 文件。 3. 在 Android Studio 中,右键点击工程目录,选择 Add > Folder > JNI Library Folder,创建一个 jniLibs 目录。 4. ...

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

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

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

    本示例将详细介绍如何通过JNI调用第三方动态库,并生成两个.so文件。 首先,我们需要了解.so文件在Android中的角色。在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码...

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

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

    Android CMake调用第三方库

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

    qt生成so文件,再调用so文件-1.pdf

    "Qt 生成 so 文件并调用 so 文件" Qt 是一个跨平台的应用程序开发框架,它支持多种操作系统,包括 Windows、Linux 和 macOS。在 Linux 系统中,因为不支持 dll 文件,而是支持 so 文件,因此,需要生成 so 文件...

    Android.mk引入第三方jar包和so库文件的方法

    至于引入第三方so库文件的方法,通常将so库文件放置在system/lib目录下。在Android系统中,系统级的应用会在编译过程中自动查找system/lib目录下的so库文件。如果需要在编译过程中就把so库拷贝到system/lib目录下,...

    qt环境调用第三方库

    ### Qt环境调用第三方库详解 #### 一、引言 在进行软件开发时,我们经常需要使用到第三方库来实现特定功能或者提高开发效率。Qt作为一种强大的跨平台应用程序开发框架,支持多种语言和操作系统环境,包括Linux。...

    JNI静态/动态注册,引用第三方so库demo

    1. 将第三方SO库放入项目的`jniLibs`目录下,Android Studio会自动将其打包到APK中。 2. 在Java代码中,通过`System.loadLibrary`加载库,如`System.loadLibrary("library_name")`。 3. 注意处理不同CPU架构的ABI...

    vs2015跨平台linux开发so库例子

    标题中的“vs2015跨平台Linux开发so库例子”指的是使用Visual Studio 2015进行跨平台开发,创建适用于Linux系统的动态链接库(.so文件)。Visual Studio 2015引入了对Linux开发的支持,允许开发者在Windows环境下...

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

    3. **第三方库集成**:在Android中,如果我们想使用C或C++编写的第三方库,通常需要将库文件(如.so动态链接库)放入项目的jniLibs目录下,根据不同的CPU架构(armeabi、armeabi-v7a、arm64-v8a、x86、x86_64等)...

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

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

Global site tag (gtag.js) - Google Analytics