android module 引用libs里面的so文件_Android中的JNI开发,你了解多少?

45ddf8f6c7803b9db2893ba2aa5417ff.gif4270b08374e1908c50136767627685a6.png

一,什么是任务及管理

任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。

一、步骤,修改build.gradle,添加cmakelists,写JNI接口,写c++,这个是不是流水线的方式集成,不了解每一步是做什么的;

.so文件

so是shared object的缩写,见名思义就是共享的对象,机器可以直接运行的二进制代码。

我们通过C/C++开发的软件,如果以动态链接库的形式输出,那么在Android中它的输出就是一个.so文件。

相比于.a,.so文件是在运行时,才会加载的。所以,当我们将.so文件放入工程时,一定有一段Java代码在运行时,load了这个native库,并通过JNI调用了它的方法。

所以,当我们使用JNI开发时,我们就是在开发一个.so文件。不论我们是开发一个工程,还是开发一个库,只要当我们使用C++开发,都会生成对应的.so文件。

所以JNI开发的核心是,我们生成so的过程,和使用so的过程。

生成.so文件

当我们在新建工程过程中,选中support c++时,系统会为我们写好一些配置

build.gradle

android {    compileSdkVersion 29    defaultConfig {        minSdkVersion 22        targetSdkVersion 29        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.test.runner.AndroidJUnitRunner"        consumerProguardFiles 'consumer-rules.pro'        externalNativeBuild {            cmake {                cppFlags "-fexceptions"                abiFilters "armeabi-v7a"            }        }        ndk{            abiFilters"armeabi-v7a"        }    }    externalNativeBuild {        cmake {            path "src/main/cpp/CMakeLists.txt"            version "3.10.2"        }    }    compileOptions {        sourceCompatibility = 1.8        targetCompatibility = 1.8    }    sourceSets{        main{            jniLibs.srcDirs'libs'        }    }    repositories {        flatDir {            dirs 'libs'        }    }}

这是module的build.gradle中的一段。其中,两个externalNativeBuild与ndk是与JNI相关的配置。

我们写好的.cpp/.h文件需要经过编译才能生成.so,让apk得以调用。在编译生成.so文件的过程中,我们可以添加如下一些配置。

cppFlags

cmake时的额外参数,

cppFlags "-fexceptions"

来支持C++异常。

abiFilters

设置 执行 gradle assembleRelease 时,支持的 SO 库构架。如果像上面的代码这样设置,我们打出来的包,就会包含三种架构的.so包。这必然会使APK包体积变大。可以考虑使用productFlavors进行优化。

cmake.path

指定cmakelists文件的路径。

除了这些必须的标签外,externalNativeBuild中还有很多可以配置的东西,因为不是必需,不在此赘述。如ndkBuild中可以设置c++的版本等配置。

CMakeLists.txt

# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.4.1)# Creates and names a library, sets it as either STATIC# or SHARED, and provides the relative paths to its source code.# You can define multiple libraries, and CMake builds them for you.# Gradle automatically packages shared libraries with your APK.add_library(comm_lib SHARED IMPORTED)
set_target_properties(comm_lib        PROPERTIES        IMPORTED_LOCATION        ../../../../libs/${ANDROID_ABI}/libcomm_lib.so)
add_library( # Sets the name of the library.             native-lib             # Sets the library as a shared library.             SHARED             # Provides a relative path to your source file(s).             native-lib.cpp )# Searches for a specified prebuilt library and stores the path as a# variable. Because CMake includes system libraries in the search path by# default, you only need to specify the name of the public NDK library# you want to add. CMake verifies that the library exists before# completing its build.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 )# Specifies libraries CMake should link to your target library. You# can link multiple libraries, such as libraries you define in this# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.       native-lib        comm_lib       # Links the target library to the log library       # included in the NDK.       ${log-lib} )

在cpp目下编写c++的代码

62dd16aea43304521e5e671d31d57a7a.png

在Java中声明native方法,c++自动生成方法(Android studio3.2测试)

06d226ac8b92a024c8eb5a0259692ba9.png

Java native声明的方法及类型在C++中的方法转换如下:

b3d22766aeea9fdaed4ec5038223810f.png

可直接调用在Java层调用方法执行C++代码;

C/C++调用Java代码,比如说Java需要知道C++执行的回调结果,异步处理回调数据是和我们在Java中写callback是一样,数据回调之后set值通知实现类的事件; 这个在C中如果被Native调用的Java类是静态类:FindClass通过传java中完整的类名来查找java的class,如果是非静态类:GetObjectClass通过传入jni中的一个java的引用来获取该引用的类型,他们之间的区别是,前者要求你必须知道完整的类名,后者要求在Jni有一个类的引用;

Java代码

8734649f9aca0df9dd5af6069e32a1b3.png

在C中定义的jobect和jmethodid及赋值:

00d6323bb9956f70c7eee98f737ff0e3.png

1ae7b752c765a681d78cf56acd02437e.png

调用Java方法

8dab160d2ca3557490355b6fd4d6b2b8.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个带关闭按钮的Div窗口,很漂亮

<html><head><title>JSCSS实现带关闭按钮的DIV弹出窗口</title><script> function locking(){ document.all.ly.style.display"block"; document.all.ly.style.widthdocument.body.clientWidth; document.all.ly.style.heightdocu…

windows进入mysql改user_windows下如何修改mysql数据库密码

先要声明一点&#xff0c;大部分情况下&#xff0c;修改MySQL是需要有mysql里的root权限的&#xff0c;所以一般用户无法更改密码&#xff0c;除非请求管理员。方法一使用phpmyadmin&#xff0c;这是最简单的了&#xff0c;修改mysql库的user表&#xff0c;不过别忘了使用PASSW…

LeetCode 406. Queue Reconstruction by Height

原题链接在这里&#xff1a;https://leetcode.com/problems/queue-reconstruction-by-height/description/ 题目&#xff1a; Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k), where h is the height …

zabbix中mysql连不上的排错_zabbix监控软件的使用排错

在linux系统中&#xff0c;几乎所有运行的服务都会产生相对就的日志(log)&#xff0c;所运行的程序在出错时都会有错误提示&#xff0c;即使没有任何提示也可以通过“echo $”来查看运行是否成功。使用zabbix已经有一段时间了&#xff0c;整理一下遇到过的问题和解决的方法以。…

Unity读取服务器声音文件

Unity读取服务器声音文件 功能1.在网站的根目录放置一个声音文件Alarm01.wav&#xff08;这个是window系统自带的找不到这个格式的可以直接在C盘搜索&#xff09;2.在WebManager.cs脚本中添加clipPath、audio、m_downloadClip属性和DownloadSound&#xff08;&#xff09;函数&…

Tomcat之Windows环境下配置多个服务器

在应对多项目多端口的情况配置一个服务器是远不能满足开发条件的。例如微信公众号回调域名只接受80端口&#xff0c;而其他项目一般为默认的8080或者自定义的其他的端口。 废话多说&#xff0c;直入主题 准备条件&#xff1a;tomcat文件夹&#xff0c;notepad2 1.Apache官网上下…

中信银行MySQL面试_【深圳中信银行信用卡中心面试】面试题_面试经验_面试流程-看准网...

面试官的问题&#xff1a;问SpringMVC的流程。答请求→DispatcherServlet→Handler→Controller→DispatcherServlet →ModelAndView→View。问线程池的几个参数有哪些&#xff0c;都是做什么的。答当一个任务通过execute(Runnable)方法欲添加到线程池时&#xff1a;1、 如果此…

Vue中计算属性与class,style绑定

var vmnew Vue({ el:#app, data:{ a:2, }, computed:{ //这里的b是计算属性&#xff1a;默认getter b:{ get:function(){ return this.a1 }, set:function(newValue){ this.anewValue-3 } } } }); console.log(vm.b);//3 vm.a3; console.log(vm…

mysql optimizer组件_MySQL Optimizer

最后更新&#xff1a;2018-10-09当前版本&#xff1a;1.9.1应用大小&#xff1a;8.8 MB应用语言&#xff1a;英文系统要求&#xff1a;OS X 10.11 或更高应用描述&#xff1a;MySQL和MariaDB优化工具MySQL Optimizer 简介&#xff1a;MySQL Optimizer for Mac(MySQL和MariaDB优…

nagios mysql 监控_nagios监控mysql

说明&#xff1a;被监控客户端要先安装mysql,必须安装mysql-devel,再安装nagios-plugins&#xff0c;nrpea、进入mysql,新建一个nagiosdb数据库&#xff0c;并授权mysql –uroot –p123456create database nagiosdb;grant all on nagiosdb.* [email protected] identified by &…

新建文件的UID和GID

默认情况下&#xff1a;新建文件的用户ID为操作当前文件进程的有效用户ID&#xff08;参考以前文章&#xff09;&#xff0c;新建文件的组ID为操作当前文件的进程的有效组ID 特殊情况&#xff1a;当当前新建文件的目录的SET-GID位被设置时&#xff0c;那么新建文件的组ID将继承…

mysql 1157_更新时出现MySQL错误1157,但是我在where子句中使用主键

我有个1157错误错误代码:1175您正在使用安全更新模式,并且尝试更新没有使用键列的WHERE的表。若要禁用安全模式,请在“首选项”->“SQL编辑器”中切换该选项并重新连接。当我试图执行这个语句时UPDATE ipSETip_countryCode GB,ip_countryName United Kingdom,ip_city Lon…

java 反射的效率_如何提高使用Java反射的效率?

前言在我们平时的工作或者面试中&#xff0c;都会经常遇到“反射”这个知识点&#xff0c;通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等&#xff0c;但是在使用的同时又伴随着另一种声音的出现&#xff0c;那就是“反射”很慢&#xff0c;要少用。难道…

个人项目-数独

项目源代码的Github链接 https://github.com/yaoling1997/softwareFirstHomework 需求分析 一、生成数独 命令&#xff1a;sudoku.exe -c n 要求&#xff1a; (1)输出到sudoku.txt (2)不重复 (3)1<n<1000000 (4)可以处理异常情况&#xff0c;如&#xff1a;sudoku.exe -c…

java list 重复数据_java 查找list中重复数据实例详解

java 查找list中重复数据实例详解需求&#xff1a;查找一个List集合中所有重复的数据&#xff0c;重复的数据可能不止一堆&#xff0c;比如&#xff1a;aa, bb, aa, bb, cc , dd, aa这样的数据。如果有重复数据&#xff0c;则给这些重复数据加上编号&#xff0c;上述数据改为&a…

navicat premium 连接出现的问题

1、listener does not currently know of service requested in connect descriptor 2、问题截图&#xff1a; 3、问题原因&#xff1a;服务名或者SID不正确 4、改正方法&#xff1a;打开 图中tnsnames.ora文件 找到 XE就是服务名 正确连接&#xff1a; 转载于:https://www.cnb…

quartz java spring_从零开始学 Java - Spring 使用 Quartz 任务调度定时器

生活的味道睁开眼看一看窗外的阳光&#xff0c;伸一个懒腰&#xff0c;拿起放在床一旁的水白开水&#xff0c;甜甜的味道&#xff0c;晃着尾巴东张西望的猫猫&#xff0c;在窗台上舞蹈。你向生活微笑&#xff0c;生活也向你微笑。请你不要询问我的未来&#xff0c;这有些可笑。…

excel查重复_智学网怎么登录 智学网怎么查分数 智学网统一登录平台网址

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供读者参考&…

树莓派Java程序运行_树莓派上Java程序作为linux服务并开机自动启动

http://www.iigrowing.cn/shu_mei_pai_shang_java_cheng_xu_zuo_wei_linux_fu_wu_bing_kai_ji_zi_dong_qi_dong.html刚刚买了&#xff0c; 树莓派&#xff0c; 准备做一些程序&#xff0c; 放到树莓派上&#xff0c; 平时树莓派上不接显示器等各种设备&#xff0c;直接随着adsl…

**设计模式中的常用原则

1 单一职责原则&#xff1a; 单一职责就是发现软件设计中的不同职责&#xff0c;并把这些职责相互分离。比如代理模式中&#xff0c;验证交给代理完成&#xff0c;真实对象只需要关注自身的逻辑实现。见http://www.cnblogs.com/buptzlb/p/7595899.html 应用四 2 开放-封闭原则…