[Android]JNI的基础知识

news2024/9/23 7:23:45

目录

1.什么是JNI  

2.配置JNI开发环境NDK

3.创建Native C++类型的项目

4. 了解CMakeLists.txt 文件

5.了解native-lib.cpp 文件

6.在 Android 的 MainActivity 中调用 native-lib.cpp 中实现的本地方法


1.什么是JNI  

      JNI(Java Native Interface)是一种允许Java代码与本地代码(如C或C++)进行交互的技术。它提供了一种机制,使得Java应用程序可以调用本地方法或库,并允许本地代码访问Java应用程序中的对象和方法。

2.配置JNI开发环境NDK

打开Android Studio,点击“Tools”,转到“SDK Manager”,选择“SDK Tools”选项卡,并选中“NDK”和“CMake”进行安装。

3.创建Native C++类型的项目

      你可以创建一个 Android 的 Native C++ 项目,并在其中编写 C++ 代码,并使用 JNI 接口与 Java 代码进行交互。这样你就可以充分利用 C++ 的性能优势,并与 Android 平台进行无缝集成。

其中在 src/main/cpp 目录下

CMakeLists.txt 文件:该文件是用于配置和管理你的 C++ 代码构建过程的主要文件。

native-lib.cpp 文件:你可以在native-lib.cpp 文件里面来实现你的 C++ 代码逻辑。

MainActivity: 中调用 native-lib.cpp 中实现的本地方法

4. 了解CMakeLists.txt 文件

CMakeLists.txt 文件是一个文本文件,用于配置和管理 CMake 构建系统的行为。

#cmake最低版本要求
cmake_minimum_required(VERSION 3.22.1)

project("jni_test")

# 配置so库编译信息
add_library(
        # 输出so库的名称
        jni_test
        # 设置生成库的方式,默认为SHARE动态库
        SHARED
        # 列出参与编译的所有源文件
        native-lib.cpp)

# 查找代码中使用到的系统库
find_library(
        log-lib
        log)

# 指定编译目标库时,cmake要链接的库
target_link_libraries(
        # 指定目标库,native-lib 是在上面 add_library 中配置的目标库
        jni_test
        # 列出所有需要链接的库
        ${log-lib})

常用的命令有:

1.指定 CMake 的最低版本要求。

#cmake最低版本要求
cmake_minimum_required(VERSION 3.22.1)

2.使用 project 命令来指定项目的名称和版本。

project("jni_test")

3. 通过 set 方法定义了 so 头文件 所在目录。

其中 CMAKE_SOURCE_DIR 为系统变量,指向 CMakeLists.txt 所在目录。
set(OPENCV_LIBS_DIR ${CMAKE_SOURCE_DIR}/../opencv_include)

4.引入其他模块。

include_directories(${OPENCV_LIBS_DIR})

5.添加源文件。

#opencv
add_library(libopencv_java3
        SHARED
        IMPORTED )

6.set_target_properties 命令可以指定构建结果的输出路径、名称等。

其中ANDROID_ABI 是系统变量,指 向 so 对应的 CPU 框架目录:armeabiarmeabi-v7a、x86 ...

set_target_properties(libopencv_java3
        PROPERTIES IMPORTED_LOCATION
        ${OPENCV_LIBS}/${ANDROID_ABI}/libopencv_java3.so )

7.  target_link_libraries 命令,你可以指定要链接到项目中的静态库或动态库。

target_link_libraries( jni_test
        libopencv_java3
        ${log-lib}
        )

5.了解native-lib.cpp 文件

native-lib.cpp 文件中的内容可以根据你的需求具体编写,但通常会包含以下部分:

  1. 包含头文件。

    #include <jni.h>
    #include <string>
  2. 实现本地方法:在 native-lib.cpp 文件中,你需要实现在 JNI 接口文件中声明过的本地方法。这些方法将从 Java 代码中调用。

    extern "C" JNIEXPORT jstring JNICALL
    Java_com_example_jni_1test_MainActivity_stringFromJNI(
            JNIEnv* env,
            jobject /* this */) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
     

    在上述例子中,我们实现了一个名为stringFromJNI 的本地方法,它返回一个字符串给调用方。

6.在 Android 的 MainActivity 中调用 native-lib.cpp 中实现的本地方法


public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("jni_test");
    }

      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //省略
      
    }

 
    public native String stringFromJNI();
}

native-lib.cpp 中的本地方法stringFromJNI () 在 Java 中以相同的方法名进行调用。

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

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

相关文章

SciencePlots 基本语法及特点

文章目录 简介安装 LaTeXSciencePlots 绘图示例 简介 用户有时需要根据期刊的配图绘制要求进行诸如字体、刻度轴、轴脊、图例等图层属性的定制化修改&#xff0c;耗时的同时也会容易导致用户忽略一些图层细节要求。 SciencePlots 作为一个专门用于科研论文绘图的第三方拓展工…

设计模式第九讲:常见重构技巧 - 去除不必要的!=

设计模式第九讲&#xff1a;常见重构技巧 - 去除不必要的! 项目中会存在大量判空代码&#xff0c;多么丑陋繁冗&#xff01;如何避免这种情况&#xff1f;我们是否滥用了判空呢&#xff1f;本文是设计模式第九讲&#xff0c;讲解常见重构技巧&#xff1a;去除不必要的! 文章目录…

机房安全之道:构筑坚固的网络防线

引言&#xff1a; 在数字化时代&#xff0c;机房成为了许多组织和企业的核心基础设施&#xff0c;承载着重要的数据和应用。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;机房的安全性显得尤为重要。本文将深入探讨如何构建坚固的网络防线&#xff0c;保护机房免受攻击的方…

代码随想录打卡—day42—【DP】— 8.27 01背包基础

1 01背包基础 背包概述&#xff1a; 1.1 01背包是什么 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 1.2 01背包二维数组 二维数组还…

JavaSE 集合框架及背后的数据结构

目录 1 介绍2 学习的意义2.1 Java 集合框架的优点及作用2.2 笔试及面试题 3 接口 interfaces3.1 基本关系说明3.2 Collection 常用方法说明3.3 Collection 示例3.4 Map 常用方法说明3.5 Map 示例 4 实现 classes5 Java数据结构知识体系5.1 目标5.2 知识点 1 介绍 集合&#xf…

【运维】hadoop集群安装(一)多节点安装

文章目录 一.Purpose二. Prerequisites三. Installation1. 节点规划2. Configuring Hadoop in Non-Secure Mode3. 准备工作4. 配置core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlworkers 4. 分发配置、创建文件夹5. 格式化6. 操作进程6.1. hdfs启动停止 6.2. yarn启动…

java 高级面试题整理(薄弱技术-2023)

session 和cookie的区别和联系 session1.什么是session Session是另一种记录客户状态的机制&#xff0c;不同的是Cookie保存在客户端浏览器中&#xff0c;而Session保存在服务器上。客户端浏览器访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录在服务器上。这就…

Docker容器:docker consul的注册与发现及consul-template

Docker容器&#xff1a;docker consul的注册与发现及consul-template守护进程 一.docker consul的注册与发现介绍 1.什么是服务注册与发现 &#xff08;1&#xff09;服务注册与发现是微服务架构中不可或缺的重要组件。 &#xff08;2&#xff09;为解决服务都是单节点的&a…

基于动物迁徙算法优化的BP神经网络(预测应用) - 附代码

基于动物迁徙算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于动物迁徙算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.动物迁徙优化BP神经网络2.1 BP神经网络参数设置2.2 动物迁徙算法应用 4.测试结果&#xff1a;5…

IT论坛测试

目录 一、项目介绍 项目名称 项目简介 相关技术 项目展示 二 、测试用例设计和功能测试 测试用例设计 注册页面 登陆页面 首页面 发布帖子页面 修改个人信息页面 功能测试 注册页面 登录页面 首页面 发布帖子页面 修改个人信息页面 三、接口测试 1.Junit单…

HAproxy+keepalived高可用配置搭建

目录 一、概述 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;核心功能 &#xff08;三&#xff09;关键特性 &#xff08;四&#xff09;应用场景 二、安装 1&#xff09;拓补图 2&#xff09;配置 &#xff08;一&#xff09;内核配置 &#xff08;二…

【golang】派生数据类型---指针 标识符、关键字等

1、指针 对比C/C中的指针&#xff0c;go语言中的指针显得极为简洁&#xff0c;只是简单的获取某个空间的地址 或者 根据指针变量中的内容 获取对应存储空间的内容等操作。 具体示例如下&#xff1a; go中使用指针需要注意的点&#xff1a; 可以通过指针改变它所指向的内存空…

5 STM32标准库函数 之 外部中断/事件控制器(EXTI)所有函数的介绍及使用

5 STM32标准库函数 之 外部中断/事件控制器&#xff08;EXTI&#xff09;所有函数的介绍及使用 1. 图片有格式2 文字无格式五 库函数之外部中断/事件控制器&#xff08;EXTI&#xff09;所有函数的介绍及使用前言一、图片预览&#xff0c;无格式&#xff08;CSDN&#xff09;二…

C++ 工具

C参考手册 Learncppcplusplustutorialspoint/cplusplusAwesomeC 写在最后&#xff1a;若本文对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶

RS485保护电路

今天给大家分享485接口的EMC设计&#xff0c;希望对电路设计&#xff0c;及相关软件开发的人员有帮助。 一、原理图 1. RS485接口6KV防雷电路设计方案 &#xff08;RS485接口防雷电路&#xff09; 接口电路设计概述&#xff1a; RS485用于设备与计算机或其它设备之间通讯&…

c++11 标准模板(STL)(std::basic_ostringstream)(一)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

week6刷题

题解: 使用二分查找 class Solution { public:int minArray(vector<int>& numbers) {int low 0;int high numbers.size() - 1;while (low < high) {int pivot low (high - low) / 2;if (numbers[pivot] < numbers[high]) {high pivot;}else if (numbers…

学习JAVA打卡第四十四天

Scanner类 ⑴Scanner对象 scanner对象可以解析字符序列中的单词。 例如&#xff1a;对于string对象NBA 为了解析出NBA的字符序列中的单词&#xff0c;可以如下构造一个scanner对象。 将正则表达式作为分隔标记&#xff0c;即让scanner对象在解析操作时把与正则表达式匹配的字…

<C++> STL_stack和queue

1.stack的介绍和使用 1.1 stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&am…

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成 目录 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成。 生成对抗…