首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用nar-maven- .so将外部插件库添加到jni项目中

使用nar-maven-plugin将外部插件库添加到JNI项目中是一种将本地代码与Java代码结合的方法,以实现更高级别的功能和性能。

nar-maven-plugin是一个Maven插件,用于构建本地代码库(Native ARchive)并将其与Java代码一起打包到最终的JAR或WAR文件中。它支持多种本地代码库类型,包括.so(Linux/Unix)、.dll(Windows)和.dylib(MacOS)。

使用nar-maven-plugin添加外部插件库到JNI项目的步骤如下:

  1. 在Maven项目的pom.xml文件中添加nar-maven-plugin插件的配置:
代码语言:xml
复制
<build>
  <plugins>
    <plugin>
      <groupId>com.github.maven-nar</groupId>
      <artifactId>nar-maven-plugin</artifactId>
      <version>3.0.0</version>
      <extensions>true</extensions>
      <configuration>
        <libraries>
          <library>
            <type>jni</type>
            <narSystemPackage>com.example</narSystemPackage>
            <narSystemPackage>com.example2</narSystemPackage>
            <narSystemPackage>com.example3</narSystemPackage>
          </library>
        </libraries>
      </configuration>
    </plugin>
  </plugins>
</build>
  1. 将外部插件库文件(.so、.dll或.dylib)放置在项目的指定目录下,例如src/main/native目录。
  2. 在JNI代码中使用外部插件库的功能。可以通过Java的本地方法接口(JNI)调用本地代码库中的函数。
  3. 使用Maven构建项目,nar-maven-plugin将会自动将本地代码库打包到最终的JAR或WAR文件中。

nar-maven-plugin的优势在于它简化了本地代码库的构建和集成过程,使开发人员能够更轻松地使用本地代码库的功能。它还提供了一些额外的功能,如自动检测本地代码库的依赖关系、自动生成JNI头文件等。

nar-maven-plugin的应用场景包括但不限于以下几个方面:

  1. 需要使用本地代码库提供的高性能功能,如图像处理、音视频编解码等。
  2. 需要与现有的C/C++库进行集成,以实现更复杂的功能。
  3. 需要在Java项目中使用特定平台的底层功能,如操作系统API、硬件接口等。

推荐的腾讯云相关产品和产品介绍链接地址如下:

  1. 腾讯云函数计算(SCF):https://cloud.tencent.com/product/scf 腾讯云函数计算是一种事件驱动的无服务器计算服务,可帮助开发者在云端运行代码,无需关心服务器管理和扩展性。
  2. 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke 腾讯云容器服务是一种高度可扩展的容器管理服务,可帮助用户轻松部署、管理和扩展容器化应用程序。
  3. 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb 腾讯云数据库是一种高性能、可扩展的云数据库服务,支持多种数据库引擎,如MySQL、Redis、MongoDB等。

请注意,以上链接仅供参考,具体的产品选择应根据实际需求和项目要求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android JNI学习(二)——实战JNI之“hello world”

CMakeLists.txt 2、CMake 按照构建脚本的命令 C++ 源文件 native-lib.cpp 编译到共享的对象中,并命名为 libnative-lib.so ,Gradle 随后会将其打包到...PS:这里注意一点就是:Instant Run 与使用原生的项目不兼容 如果想看Gradle是否原生打包到APK中,可以使用Analyze APK来检测。...七、CMake的应用 我们在做日常需求的时候,往往会遇到一个问题,即在已有的项目中,添加C,这样就不能通过上面的创建流程,来使用CMake。那怎么办?...在构建应用时,Gradle会以依赖的形式运行CMake或ndk-build,并将共享的打包到APK中。Gradle还是用构建脚本来了解将那些文件添加到Android 项目中。...在此之间,您可以继续使用Android Studio3.0或者更高版本的experimental插件,或者使用Android Studio支持的外部原生构建工具。

2.1K42

Android插件化学习之路(一)之动态加载综述

: 1) 动态加载so; 2) 动态加载dex/jar/apk文件(现在动态加载普遍说的是这种); 第一种,Android中NDK中其实就使用了动态加载,动态加载.so并通过JNI调用其封装好的方法...这里为后面要讲的内容提前说明一下,一般情况下我们是把so一并打包在APK内部的,但是so其实也是可以从外部存储文件加载的。...动态加载so应该就是Android最早期的动态加载了,不过so不仅可以存放在APK文件内部,还可以存放在外部存储。...Android开发中,更换so的情形并不多,但是可以通过把so挪动到APK外部,减少APK的体积,毕竟许多so文件的体积可是非常大的。...目前采用jni hook方案的项目中比较热门的有阿里的dexposed和AndFix。

94921

Android Studio NDK 代码 Source Insight调试 (NDK 目前开发方案 | NDK 编译 | 导入 so | 项目编码转换)

Android 官方的示例总是不稳定, 这两个月都改变了好几次了, Gradle 插件之前支持的后来也不支持了, 遇到各种问题, 最后还是用命令行编译, 然后 so 导入到 Android Studio...项目中; 1....暂时方案 Android 工程直接使用 命令行编译好的 so 暂时的方案 :  -- 使用命令行 ndk-build 生成 so , 然后 Android 项目中直接使用 so ; -- 编译项目...so 到 Android 项目中 : 在 src/main 目录下创建 jniLibs 目录, ndk 编译后的 armeabi 目录拷贝到该目录, 运行正确; . 3..../jni_gb18030/"{}"' \; 拷贝项目 : 转换后的 jni_gb18030 目录中的项目拷贝到 SourceInsight 中即可查看该项目;

48720

创建Android的方法及Android .aar文件用法小结

以依赖形式添加您的 要在另一个应用模块中使用您的 Android 的代码,请按以下步骤操作: 1、通过两种方式之一添加到您的项目(如果您是在相同项目中创建的模块,则该模块已经存在,您可以跳过此步骤...模块导入到您的项目中: 1、点击 File New Import Module。 2、输入库模块目录的位置,然后点击 Finish。 模块复制到您的项目中,因此您可以尽管编辑代码。...模块可以依赖外部 JAR 您可以开发一个依赖于外部(例如 Maps 外部)的模块。在这种情况下,相关应用必须针对包含外部(例如 Google API 插件)的目标构建。...要使用中不同的构建类型,您必须将依赖添加到应用的 build.gradle文件的 dependencies块中,并在库的 build.gradle文件中将 publishNonDefault设置为...assets/ /libs/名称 .jar /jni/abi 名称 /名称.so(其中 abi 名称是 Android 支持的 ABI 之一) /proguard.txt /lint.jar 下面给大家介绍下

2.9K10

SDK热更系列之概述(持续整理编辑中~)

由于本项目重点介绍重点SDK的热更新相关的内容,因此项目中的代码虽然是实现简单的功能,但是使用了SDK和demo等多个项目以及java和Native多层调用。...本项目中不会再介绍SDK相关的内容,建议可以先通过下面的链接了解这个项目的结构,然后再看热更新项目的内容,点击了解Android-gradle-jni-so。...文章列表 SDKHotfix的Demo相关介绍 主要介绍SDKHotfix的Demo如何使用,以及Demo相关的源码,运行方式等 SDK热更之SDK项目Android-gradle-jni-so介绍:...Android-gradle-jni-so是一个使用Android Studio创建的,通过gradle编译的,存在多个模块的工程的gradle构建的事例。...SDKHotfix项目中的遗留问题 这部分内容主要介绍目前SDKHotfix项目没有介绍到的或者没有实现的一些功能点以及待优化 SDK热更之SDKHotfix待优化点:点击查看 主要从安全性、后续的代码维护两个方面介绍了

1.8K100

动态下发 so 在 Android APK 安装包瘦身方面的应用

我在以往的文章 使用 SO 时要注意的一些问题 [1] 中简单谈过 so 动态化的一些问题,不过那些问题也仅仅是在 DEMO 项目里进行挖掘,当具体投入到生产项目中时,面临的挑战要严峻许多。...不过 Hash 信息一般都会随之 so 文件的变动而改变,每次都需要调整这些数据比较麻烦,我想到的优化方案是“通过类似 APK 安装包签名校验的方式来确保安全性”: so 文件打包成 APK 格式的插件包并使用...JNI 代码隔离方案 ? 顾名思义,就是涉及到的 JNI 代码拆解到一个独立的模块,一同打包进 so 插件包里。...运行时动态加载 so 的时候,先给 so 插件创建一个插件 ClassLoader,在插件 ClassLoader 内部执行“so loading”和“jni calling”。...其他问题 相关 JNI 类污染问题 JNI 方法需要在加载完成相应的 so 才能正常调用,所以有不少开发选择 System#loadLibrary("xxx" ) 之类的代码写在 JNI 类的静态代码块

8.4K74

Android如何调用so文件

前言 小编对接的安卓测试项目团队中有部分团队使用C++开发项目代码,出于好奇去学习了解了一下在安卓项目中集成C++代码的方法,下面和大家分享一下。...3.扩展性好:可以使用其他语言开发的开源。 4.易于复用:用本地代码开发的代码不仅在Android中使用,还可嵌入到其他类型平台上使用。...:通过Gradle提供的gradle-experimental插件编译产生so文件; 第三个阶段:目前最常用的方式是使用CMake和Gradle编译出so文件。...第三步:配置编译文件 Gradle需要通过调用CMake编译脚本C\C++代码编译为java可以调用的外部链接,所以接下来需要进行Gradle和CMake的配置。...调用JNI:现在在我们声明的getHelloString()方法之前加载刚才声明产生的so,然后再在程序中调用getHelloString()方法就可以执行so中对应的C++代码了。 ?

10.3K71

64 位适配黑科技:一键检索未适配的 so 文件

>/lib.so 完成查找后,PMS 会将它们复制到 app 目录下的 so 路径(例如:/data/app/[packagename]/lib/arm64),并在应用运行时执行到 System.loadLibrary...如果没有查找到匹配的 so 文件,不会中断安装过程,但在运行时会崩溃。 关于加载 so 文件的过程,我们在 《说说 so 从加载到卸载的全过程》这篇文章里已经讨论过了。...上层应用的重点就是提供 64 位的 so 文件,我们可以需要做的事情拆解为三部分: 1、检索不支持 64 位 的 so 文件(EasyPrivacy 插件) 2、构建 64 位 APK 3、分发 64...为了快速检索到项目中不支持 64 位 的 so 文件,贴心的我已经帮你实现为一个 EasyPrivacy 插件。...例如, 项目中存在 armeabiv-v7a 类型的 libc++_shared.so 文件,但没有提供对应的 64 位 arm64-v8a 类型,就会在分组 so in armeabiv-v7a, but

75020

Android Gradle必备基础知识

重要: 这里只能使用com.android.application插件。如果使用java插件将会报错。...Build Types 默认情况下Android插件会自动应用程序设置成有一个debug版本和一个release版本。 这就是通过调用BuildType对象完成。...远程仓库 Gradle只是使用Maven和Ivy仓库。但是仓库必须要添加到列表中,并且必须声明所依赖仓库的Maven或者Ivy定义。...不仅会移除项目中使用的资源,而且还会移除项目所以来的类中的资源。注意,资源清理只能在与代码清理结合使用(例如ProGuad)。这就是为什么它能移除所依赖类的无用资源。...通常,类中的所有资源都是使用的,只有类中无用代码被移除后这些资源才会变成没有代码引用的无用资源。 android { ...

73310

Android Studio 3.2新功能特性

android.enableJetifier:设置true为该标志时,表示您希望获得工具支持(通过Android Gradle插件)自动现有的第三方转换为与AndroidX相同的。...此外,您可以动态功能模块添加到您的应用程序项目中,并将其包含在应用程序包中。通过动态交付,用户可以根据需要下载和安装应用的动态功能。...这意味着,如果您有使用V1编译的依赖,则可以将它们与使用Data Binding V2的项目一起使用。但是请注意,使用V1的项目无法使用通过V2编译的依赖。...'armeabi', 'mips', 'mips64' ... } } 改进了CMake构建文件的编辑器功能 如果您使用CMake C和C ++代码添加到目中,那么Android...通过此版本,您现在还可以查看和检查包含在导入到应用项目中外部C / C ++依赖的头文件。

5.4K10

一个 ClassLoader 引起的 JNI 链接错误

我们最近在做的插件工程就遇到了一个诡异的JNI链接错误。...我们的插件工程作为主工程的具体业务,主工程提供了基础的类和工具,插件工程有自己的ClassLoader,并把主工程的ClassLoader设为自己的父ClassLoader,通过双亲委托,插件工程就可以访问主工程中的类...在主工程中有一个类,有JNI方法,但为了减少主工程的包大小,so文件由插件在用到时自己下载和加载。 而这种加载方式,出现了诡异的UnsatisfiedLinkError错误。...加载,如果没找到记录,说明该so没有加载过,则通过dlopen打开该so,保存相关信息到SharedLibrary对象中,把SharedLibrary添加到libraries中,用dlsym查找JNI_OnLoad...so 2、如果主工程不好添加代码的话,我们也可以在插件里改变Runtime.load()所使用的ClassLoader,但是Runtime的load方法只有一个参数的公开方法,传ClassLoader

3.3K00

一个ClassLoader引起的JNI链接错误

前言 Android插件化工程具有减少方法数和包大小,易于扩展等优势,深得大型工程的青睐,但同时插件化也会引起一些意想不到的麻烦。我们最近在做的插件工程就遇到了一个诡异的JNI链接错误。...我们的插件工程作为主工程的具体业务,主工程提供了基础的类和工具,插件工程有自己的ClassLoader,并把主工程的ClassLoader设为自己的父ClassLoader,通过双亲委托,插件工程就可以访问主工程中的类...在主工程中有一个类,有JNI方法,但为了减少主工程的包大小,so文件由插件在用到时自己下载和加载。 而这种加载方式,出现了诡异的UnsatisfiedLinkError错误。...加载,如果没找到记录,说明该so没有加载过,则通过dlopen打开该so,保存相关信息到SharedLibrary对象中,把SharedLibrary添加到libraries中,用dlsym查找JNI_OnLoad...使用主工程中的类来加载so

1.1K110

从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建

本文分为以下章节,读者可按需阅读: 1.项目建立——新建一个跨平台视频编辑项目 2.基础 lib 集成—— ffmpeg、protobuf 这些必须使用的三方集成到项目中 3.基础数据结构——定义和讲解一些视频编辑流程中需要使用到的数据结构...这个 module 将会整合所有的,共享 cpp 代码、.so 文件、.a 文件,然后通过 java 代码被外部调用。...4.最后我们看代码块1,这里都有注释比较简单,就是 libffmpeg.so 和他的头文件链接到整个项目中 ?...2.当然还得 protobuf c++ 的集成到项目中,如图5我们新建一个 android_protobuf 的目录,然后刚刚编译生成的 .a 文件与头文件拷贝到里面去,这里与 ffmpeg 的集成类似...不同的地方在于,protobuf 生成的是 .a 文件,这里需要将其作为静态链接添加到目中。详细的在代码块1中已经说明了。 ----代码块2,本文发自简书、掘金:何时夕----- #!

1.6K30

NDK 系列(6):说一下注册 JNI 函数的方式和时机

中 loadLibrary 的执行流程[3] 5、so 文件适配 64 位架构:Gradle 插件一键检索未适配[4] 6、so 文件动态化:动态下载 7、so 文件体积优化:文件精简 三、基础理论...如果事先没有加载 so ,则自然无法搜索到,抛出 UnsatisfiedLinkError 异常; 3、建立内部数据结构,建立 Java native 方法与 JNI 函数的函数指针的映射关系; 4...关于加载 so 的流程在 4、so 文件加载过程分析[9] 这篇文章里讲过,加载后的共享就是存储在 libraries_ 表中。 ---- 2....,后续调用不需要重复搜索 2、加载 so 时 动态注册 加载 so 时会自动回调 JNI_OnLoad 函数,在其中调用 RegisterNatives 注册 3、提前注册 动态注册 在加载 so...的执行流程: https://juejin.cn/post/6892793299427491854 [4] 5、so 文件适配 64 位架构:Gradle 插件一键检索未适配: https://juejin.cn

31420

Android Studio开发so实践

如何配置NDK编译环境可以参考我以前发表的旧文: Cocos2d-x 2.2.3 使用NDK配置编译环境 JNI_Android项目中调用.so动态 Eclipse的如何通过NDK生成so就不多说了...如何通过JNI调用Native层的c/c++代码,可以参考我的一篇文章: JNI_最简单的Java调用C/C++代码 注:window的动态是.dll文件,而Linux下的动态是.so文件 配置NDK...然后再添加到PATH环境变量中 ? ok,配好之后,直接可以在命令行使用ndk-build命令: ? 这里提示没有定义NDK_PROJECT_PATH变量,暂且不管,我们后面说。...执行ndk-build命令生成所有cpu架构的so ? 然后就可以在libs目录下看到所有平台的so: ? 至此,完整的so实践基本完毕,期间遇到任何问题均可留言,欢迎讨论交流。...最后 关于NDK开发so会有很多坑,本篇博客也只是引大家入门,我们在使用第三方的SDK的时候,就可能会用到别人提供的so,也可能会遇到使用so出现问题,有很多原因,可能是提供了不同的cpu架构的so

1.4K20
领券