AndroidStudio jni开发入门及打包so库和jar包

配置ndk开发环境

  1. 下载NDK,LLDB,CMake工具包
  2. 配置系统环境变量

在原有项目中进行jni开发环境配置

Androidstudio2.0之后新建的项目可直接生成cpp项目,所有详细说下在原有项目中进行jni开发环境配置:

  1. 在src/main文件夹下建一个cpp文件夹(这里存放jni代码)
  2. 在app文件夹下建一个CMakeLists.txt文件,CMake是一种跨平台编译工具
代码如下:
cmake_minimum_required(VERSION 3.4.1)# add_library()可添加多个,有多少个cpp文件可添加多少个
add_library( # 对应cpp的文件名jni-array# Sets the library as a shared library.SHARED# 对应cpp的文件名地址src/main/cpp/jni-array.cpp )find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log )#
target_link_libraries( # Specifies the target library.jni-array# Links the target library to the log library# included in the NDK.${log-lib} )
  1. 配置app下的gradle文件
代码
android {compileSdkVersion 28buildToolsVersion "28.0.2"defaultConfig {applicationId "com.jiax.myapplication"minSdkVersion 15targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {//c++的版本cppFlags "-std=c++14"abiFilters 'armeabi-v7a','x86'}}ndk{moduleName "jniTest"abiFilters "armeabi-v7a","x86"}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}//关联CMakeLists.txt文件externalNativeBuild {cmake {path "CMakeLists.txt"}}
}

编写C层代码

在cpp文件夹中建一个jni-array.cpp文件

####代码####

#include <jni.h>
/*JNIEXPORT和JNICALL这两个宏(被定义在jni.h)确保这个函数在本地库外可见,并且C编译器会进行正确的调用转换。*/
extern "C"
/**数组求和 */
JNIEXPORT jint JNICALL
Java_com_jiax_yugang_java_SimpleJniUtil_sumArray(JNIEnv *env, jclass type, jintArray arr_) {/*jint *arr = env->GetIntArrayElements(arr_, NULL);env->ReleaseIntArrayElements(arr_, arr, 0);*/jsize len = env->GetArrayLength(arr_);int buf[len];int sum = 0;//将基本类型数组某一区域复制到缓冲区中的一组函数。env->GetIntArrayRegion(arr_, 0, len, buf);for (int i = 0; i < len; i++) {sum += buf[i];}return sum;
}

打包so库

1.在CMakeLists.txt文件中添加so库输出代码:

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})


在Build->Make Porject后台会在项目文件夹下生成一个jniLibs文件夹,里面就是打包好的so库

编写java代码

拿到so库时,要建立相关的java类对外提供api,包名要跟so库的方法名里的包名一致,方法名也必须一致才能成功调用so库中的方法
1.在Android项目下建一个module,包名必须跟之前生成so库里方法名的包名一致


2.编写jni代码,类名、方法名必须跟之前生成so库里方法名的类名、方法名一致
代码

public class SimpleJniUtil {//编写native方法public static native int doubleData(int data);public static native int sumArray(int[] arr);public static native int[] arrayAddTen(int[] arr);public static native int[][] init2DArray(int size);public native String getText();static {System.loadLibrary("jni-array");//导入so库}}

3.MakeProject,生成.class文件

打包对外提供API的jar包

1.在module下的gradle文件中配置打包任务
代码如下

task makeJar(type: Copy) {delete 'build/libs/mylibrary.jar' //删除已经存在的jar包from('build/intermediates/bundles/release/')//从该目录下加载要打包的文件into('build/libs/')//jar包的保存目录include('classes.jar')//设置过滤,只打包classes文件rename('classes.jar', 'mylibrary.jar')//重命名,mylibrary.jar 根据自己的需求设置
}
makeJar.dependsOn(build)

2.打包

在工具栏切换到makejar任务运行即可打包,或在gradle栏mylibrary/other中找到makejar任务双击打包,打包后的jar会生成在你指定的build/libs/目录下

AndroidStudio jni开发入门及打包so库和jar包相关推荐

  1. AndroidStudio Jni开发-生成多个so库

    jni开发-生成多个so库 本文介绍如何使用CMakeLists生成多个so,依赖多个第三方so库. 生成多个so库 添加要生成的so. 如上图要生成两个名为:libpciesdf.so.libpci ...

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

    文章目录 一.目标及方式 二.新建调用方工程 三.新建库module 四.为库模块添加c++支持 4.1 准备CMakeLists文件 4.2 修改sdk的gradle脚本 4.3 编写c++及jav ...

  3. Android JNI开发入门之二

    在上一篇文章<Android JNI开发入门之一>中,我介绍了Android应用程序(APK)怎样通过JNI调用Native C实现的共享库.本文将进一步介绍Android应用程序通过JN ...

  4. Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)

    Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...

  5. eclipse下使用maven配置库托管jar包

    1.项目是通过maven配置库托管jar包 首先要保证maven配置库中有相应的jar包才能通过这个方法来添加jar包.maven的有点就是把要用到的jar包统一放在一个配置库中,在某个项目需要用到这 ...

  6. 【教程】如何给Eclipse中添加库(jar包)

    https://www.crifan.com/tutorial_eclipse_add_external_jar_library/ [背景] 折腾Eclipse时,经常会遇到这种情况: 缺少某个库,找 ...

  7. idea 执行 java jar_idea打包java可执行jar包的实现步骤

    1,在项目上鼠标右键 --> Open Module Settings 2, Artifacts --> + --> JAR --> From modules with dep ...

  8. git配置全局用户名和密码_还在手动打包,手动传jar包?那你确实应该学一下jekins配置了...

    本文为小编原创文章,首发于Java识堂微信公众号,一个高原创,高收藏的公众号,转载请联系作者 先说jekins能干啥,你把代码放到git上,jekins就能帮你编译代码,并且把jar包放到相应的服务器 ...

  9. maven打包可执行的jar包-包含依赖jar

    maven打包可执行的jar包: 1. 首先确保编辑器里maven环境正常 2. 运行打包的jar文件 3. 测试添加依赖后打包. 4. Unable to access jarfile test-m ...

最新文章

  1. 足球 Floyd算法
  2. vue学习之路.02
  3. linux 计划任务格式,linux crontab 定时任务格式和使用方法2019-01-13
  4. webpack打包优化_提速MAX 京东通天塔WEBPACK构建发布优化实践
  5. sdibt 1244类似于拓扑排序
  6. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by (转)
  7. html 学习笔记(9)
  8. 修改win10更新服务器,修改win10更新服务器地址
  9. PMP培训第一次听课笔记(第1-3章)
  10. 【世语纠正】吾生也有涯,而知也无涯丶本意知识太多,没必要都去
  11. 打篮球的妙处——让男人更帅,更有魅力
  12. IDEA2020版本Bpmn文件无Editor属性设置编辑器问题的解决
  13. Python 文字小游戏
  14. CSS学习笔记--文本格式化
  15. Excel-旋风图制作
  16. 分布式理论 C++11 Kafka
  17. 垃圾渗滤液的形成过程!
  18. Jumping Frog
  19. mysql 的基本表的应用_Mysql的基本应用笔记1
  20. 数据库:delete 删除语句

热门文章

  1. [强化学习实战]出租车调度-Q learning SARSA
  2. 【论文阅读】Gait Quality Aware Network: Toward the Interpretability of Silhouette-Based Gait Recognition
  3. 求问大神指点,tensorflow的图像分类模型进行android移植的时候出现了如下报错
  4. Failed to resolve directive: XXX
  5. 图机器学习——3.2 PageRank 算法问题改进与延伸
  6. 【用VBA实现Word自动打印序列号】
  7. 我们最喜欢的技术:How-To Geek值得感谢的
  8. 学习之响应式应用架构重构ReactiveX
  9. 真的,Kafka 入门一篇文章就够了
  10. 图解k8s中pod的创建流程