jni:as 进行 JNI / NDK 开发:初步配置及使用

AndroidStudio 进行 JNI / NDK 开发:初步配置及使用-CSDN博客版权声明:

本文为博主原创文章,转载请标明出处。AndroidStudio 进行 JNI / NDK 开发:初步配置及使用-CSDN博客

一、相关名词解释

JNI:java native interface,jni可以实现java和C/C++通信。

java代表java语言,

native代表当前程序运行的本地环境,一般指windows/linux,而这些操作系统都是通过C/C++实现的,所以native通常也指C/C++语言,

interface代表java跟native两者之间的通信接口,

Java Native Interface(Java 本地编程接口),一套编程规范,它提供了若干的 API 实现了 Java 和其他语言的通信(主要是 C/C++)。Java 可以通过 JNI 调用本地的 C/C++ 代码,本地的 C/C++ 代码也可以调用 java 代码。Java 通过 C/C++ 使用本地的代码的一个关键性原因在于 C/C++ 代码的高效性。

NDK:Native Development Kit(本地开发工具)

Native Development Kit(本地开发工具),一系列工具的集合,提供了一系列的工具,帮助开发者快速开发 C/C++,极大地减轻了开发人员的打包工作。这套工具集允许为 Android 使用 C 和 C++ 代码。

CMake

CMake一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果只计划使用 ndk-build,则不需要此组件。

LLDB

LLDB一种调试程序,Android Studio 使用它来调试原生代码。

二:AS 2.2以上    创建支持 C/C++(NDK cMake) 的新项目方式:

 AS2.2之前的传统创建方式:(已淘汰)

 AS2.2之后的ndk cMake创建方式:见 第三条目

三:AS 2.2以上创建支持 C/C++(NDK cMake) 的新项目的流程:

1、环境搭建

在新建项目时勾上Include C++ support 这行:

在向导的 Customize C++ Support 部分,有下列自定义项目可供选择:

C++ Standard:使用下拉列表选择使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。

Exceptions Support:如果希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle文件的 cppFlags中,Gradle 会将其传递到 CMake。
 Runtime Type Information Support:如果希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle文件的 cppFlags中,Gradle 会将其传递到 CMake。

 

主要项目结构目录

cpp 文件夹:用于编写 C/C++代码

CMakeLists.txt:CMake 脚本配置文件

配置 build.gradle 文件

要在哪个类运用 JNI ,就得加载相应的动态库

快速生成代码:Alt + Enter

( 我在kotlin类中创建了一个external函数,如何在native-lib.cpp文件里生成对应关联的函数)

    鼠标选中external  fun  getBytes(  bytes:ByteArray):ByteArray ,点击快捷键 Alt+Enter 弹出提示,Create jni function getBytes 就会在native-lib.cpp文件里生成对应的jni 函数

在 native-lib.cpp 中声明后记得在方法名的上面一行添加 extern"C",否则执行后会找不到该方法。 

新建 C/C++ 源代码文件fmf_jni.cpp   fmf_jni2.cpp,要添加到 CMakeLists.txt 文件中

2. jni debug

直接在 .cpp 文件里面加断点 ; debug 运行就好了 ;

 3 修改 so 库名字

第一步,将native-lib. cpp 文件夹下的文件名 修改 为 fmf_jni.cpp

第二步,将此句 System.loadLibrary("native-lib"); 的名字修改 fmf_jni

第三步,将 CMakeLists.txt 文件里面所有 "native-lib" 的字段修改
然后先 Clean Project ,再重新编译一下项目( Ctrl + F9)(点击锤子 不是 Rebuild Project )

4 .导出 so 文件

找到so文件的位置直接导出来 (E:\Android\NdkDemo\myNativeDemo\app\build\intermediates\cmake\freeMinApi23Debug\obj\arm64-v8a\libfmfjni.so)

你的build.gradle 配置ndk配置几个so类型 就打几个so类型库

 

 5 在现有项目中添加 C/C++文件

创建新源文件(.cpp / .c)
参考新建项目的方式在 src/main 路径下创建 cpp 文件夹 ; (也可在其他目录下创建,在第二点会配置这个路径);
在 cpp 文件夹下创建你的 .cpp / .c 源文件 ;


 6.引入第三方 .so文件,要添加到 CMakeLists.txt 文件中

 


 

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

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

相关文章

环境变量【使用命令行参数引出环境变量】

前提:命令行参数 大家在写C/C程序的时候肯定见过下面这种情况: main函数里面携带的参数,平常写代码过程中很少用到这两个参数,接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么,也不知道这个a…

Python基础--PART1

最近闲来无事,学习使用Python也有好几年了,一直没有系统的总结,现在有时间就写一写个人的一些拙见。 PART1. 核心语法(基础语法) 1. 变量 1.1 变量的定义 ​ 变量就是可变的量,对于一些有可能会经常变化的数据,我们…

上海亚商投顾:沪指震荡调整 转基因概念股逆势大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日低开低走,深成指、创业板指均跌超1%,双双创出年内新低。转基因概念股逆势大涨…

风电机浪涌保护器的防雷作用和意义

风电是一种利用风能转化为电能的清洁新能源,具有节约资源、减少污染、降低碳排放等优点。随着风电技术的发展和应用,风电场的规模和数量也不断增加,为人类提供了可持续的电力供应。然而,风电场也面临着一些挑战和风险,…

【NPM】vuex 数据持久化库 vuex-persistedstate

在 GitHub 上找到:vuex-persistedstate。 安装 npm install --save vuex-persistedstate使用 import { createStore } from "vuex"; import createPersistedState from "vuex-persistedstate";const store createStore({// ...plugins: [cr…

实验室超声波清洗机的作用

实验室超声波清洗机的作用是什么?顾名思义,其主要作用是清洗。超声波清洗机是实验室中必不可少的清洗装置,利用超声波在液体中的空化效应,产生空化气泡,由于正负压的作用下,空化气泡会在短时间内生成并爆破…

利用爬虫采集音频信息完整代码示例

以下是一个使用WWW::RobotRules和duoip.cn/get_proxy的Perl下载器程序: #!/usr/bin/perluse strict; use warnings; use WWW::RobotRules; use LWP::UserAgent; use HTTP::Request; use HTTP::Response;# 创建一个UserAgent对象 my $ua LWP::UserAgent->new();#…

药物滥用第四篇介绍

OXY: 羟考酮(Oxycodone,OXY),分子式为C18H21NO4,是一种半合成的蒂巴因衍生物。羟考酮为半合成的纯阿片受体激动药,其作用机制与吗啡相似,主要通过激动中枢神经系统内的阿片受体而起镇…

Vite 踩坑 —— require is not defined

动态require引入图片报错 require 是属于 Webpack 的方法&#xff0c;而我使用的是 Vite&#xff0c;所以我们需要去寻找 Vite 静态资源处理的方法 所以&#xff0c;我们只需要将代码改写以下形式即可。 ​ template <CarouselItem v-for"(item,index) of carous…

基于安卓Android的人在旅途旅行出行APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库…

Mini小主机All-in-one搭建教程6-安装苹果MacOS系统

笔者使用的ESXI7.0 Update 3 抱着试试的态度想安装一下苹果的MacOS系统 主要步骤有2个 1.解锁unlocker虚拟机系统 2.安装苹果MacOS系统 需要下载的文件 unlocker 这一步是最耗时间的&#xff0c;要找到匹配自己系统的unlocker文件。 https://github.com/THDCOM/ESXiUnloc…

解决appium或selenium使用时driver.find_element_by_xpath中间有删除线问题

一、问题描述 Darren洋在公司电脑搭建完成appium后准备运行appium2.0版本执行脚本时发现执行脚本中的driver.find_element_by_xpath中间有删除线&#xff0c;说明较高版本的appium及selenium中该方法已被弃用。 二、解决办法 该问题解决办法为将driver.find_element_by_xpath()…