Android开发 -- JNI开发

1.配置JNI环境

  • 创建JNI文件夹

在项目的主目录中创建一个名为 JNI 的文件夹。这个文件夹将包含所有的本地源代码和配置文件。

  • 编写Android.mk文件

这个文件是一个 Makefile,用来指导 NDK 如何编译和构建本地代码。

#清除之前定义的变量,确保每个模块的配置从干净的状态开始。
LOCAL_PATH:=$(call my-dir)#清除之前定义的变量,确保每个模块的配置从干净的状态开始。
include $(CLEAR_VARS)#定义了生成的动态链接库的名称为OBOJni,在Android系统中会自动添加前缀lib和后缀.so,成为libOBOJni.so
LOCAL_MODULE := OBOJni#指定test.cpp为此动态库的源文件。
LOCAL_SRC_FILES := test.cpp#指定链接器链接Android系统的日志库liblog,以便库中可以使用日志功能。
LOCAL_LDLIBS := -llog#引入构建系统用来编译和链接生成动态链接库的规则和命令。
include $(BUILD_SHARED_LIBRARY)
  • 配置build.gradle文件:

修改项目中的 app/build.gradle 文件,在 android{} 块中添加以下配置,以指定 JNI 库文件的存储路径和指向 Android.mk 的路径:

sourceSets {main {// 设置 JNI 库的路径jniLibs.srcDirs = ['../libs']}}externalNativeBuild {ndkBuild {//表示构建androidJNI的Android.mk的所在路径path '../jni/Android.mk'}}
  • 创建和编写test.cpp

#include <jni.h>
#include <android/log.h>void hello_test_jni()
{__android_log_print(ANDROID_LOG_ERROR,"JNI","hello JNI test!!!");
}
  •  进入JNI路径,使用powershell编译
ndk-build.cmd

 能生成 .so 文件,则表示 C++ 编译环境配置正确。

2.java调用JNI模块

  • 创建JNI调用类

src 目录下,与 Activity 类同级,创建一个用于 JNI 调用的 Java 类 OBJNI.java。这个类将封装所有 JNI 相关的操作:

public class OBJNI {// 单例模式确保全局只有一个实例private static OBJNI instance = null;public static OBJNI getInstance() {if (instance == null) {instance = new OBJNI();}return instance;}// 声明 native 方法public native void hello_jni();// 加载 C++ 编写的库static {System.loadLibrary("testjni"); // 库名需与 Android.mk 中的 LOCAL_MODULE 相同}
}
  • 生成 native 方法的 C++ 声明:

使用 javah 工具从 OBOJNI 类生成对应的 C++ 头文件。打开命令行工具,导航至 Java 源文件所在的目录,并执行:

javah -classpath . -jni com.afison.ob.OBJNI

 

  •  找到com_itcast_ace_obo_170325_OBOJNI.h中的对应函数声明 拷贝到 test.cpp中去实现
    注意 一定要在extern C {} 中去实现 否则函数名会改变

  •  重新编译cpp程序 

cd C:\Users\Ace\Documents\GitHub\OBO\OBO_170325\JNI>
ndk-build.cmd 
生成新的so

  • 在java中 Activity中 调用此方法

OBOJNI.getInstance().hello_jni();

如果控制台能够输出cpp的日志 表示代用成功

3.报错 

More than one file was found with OS independent path 'lib/arm64-v8a/libOBOJni.so'

配置packagingOptions:在你的app模块的build.gradle文件中,使用packagingOptions来解决冲突。你可以通过添加如下配置来告诉Gradle在打包时如何处理重复的so文件:

javah -classpath . -jni com.afison.ob.OBJNIandroid {packagingOptions {pickFirst 'lib/arm64-v8a/libOBOJni.so'// 或者使用exclude排除特定的so文件,如:// exclude 'lib/arm64-v8a/libOBOJni.so'}
}

JNI调用成功 

 

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

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

相关文章

安装HAP时提示“code:9568344 error: install parse profile prop check error”错误

问题现象 在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特…

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

BookStack VS HelpLook两款知识库软件的区别

现在很多企业都会进行知识管理&#xff0c;在这个过程中&#xff0c;选择一个合适的知识库软件是一个不可避免的问题。在众多知识库软件中&#xff0c;HelpLook和BookStack这两款软件备受企业瞩目。不知如何选择&#xff0c;今天LookLook同学就简单介绍一下这两款知识库的区别&…

5.27作业

定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream>using namespace std; namespace my_space {string s1;string reverse1(string s1);} using namespace my_space; int m…

深入解读 ChatGPT 的基本原理(个人总结版)

引言 背景 人工智能&#xff08;AI&#xff09;技术自20世纪中期诞生以来&#xff0c;经历了多次革新和进步。从最早的图灵测试&#xff0c;到20世纪末的深蓝计算机击败国际象棋冠军&#xff0c;再到21世纪初谷歌AlphaGo击败围棋冠军&#xff0c;AI技术的飞速发展改变了人们的…

BEVFormer论文详细解读

文章目录 1. 前言1.1 3D VS 4D1.2 .特征融合过程中可能遇到的问题1.3 .BEV提出背景1.4 .BEV最终得到了什么1.5 .输入数据格式 2. 背景/Motivation2.1 为什么视觉感知要用BEV&#xff1f;2.2 生成BEV视角的方法有哪些&#xff1f;为何选用Transformer呢&#xff1f; 3. Method/S…

Vapor Mode:Vue.js 的速度与激情,代码界的闪电侠

大家好&#xff0c;我是宝哥。 在快速发展的网络开发世界中&#xff0c;创新的Vue.js团队给我们带来了Vapor Mode。这个新模式优化了Vue的核心渲染过程&#xff0c;帮助我们的应用程序像轻烟一样运行&#xff0c;开发者无需深入复杂的优化工作。 在这篇文章中&#xff0c;我们将…

【微积分】Grant Sanderson

梯度&#xff1a;将各个偏导打包 定义&#xff1a;direction of steepest ascent 梯度向量的长度&#xff1a;最速上升方向的陡峭程度 方向导数&#xff1a;偏导的一种拓展 【托马斯微积分学习日记】13.1-线积分_哔哩哔哩_bilibili 概述 16.1line integrals of scalar funct…

直播预告:TinyVue 组件库实战解析,提升组件库构建技能!

在复杂的编码世界里&#xff0c;大家总希望能够寻找更高效、更简洁的解决方案来优化工作流程&#xff0c;提升开发效率。在5月28日晚7点 OpenTiny B站直播间&#xff0c;OpenTiny 非常荣幸地为大家带来一场关于 TinyVue 组件库实战分享的直播。届时&#xff0c;TinyVue 组件库成…

openEuler系统通过shell脚本安装openGauss 5.0.0企业版

上次提到的开机自启动的配置&#xff0c;获得了LD的称赞&#xff0c;然而LD的要求&#xff0c;都是“既得陇复望蜀”的&#xff0c;他又期望我们能实现openGauss安装的“自动化”&#xff0c;于是尝试了下用shell脚本部署&#xff0c;附件中的脚本实测有效&#xff0c;openEule…

图论(二)-图的建立

引言&#xff1a; 建图&#xff0c;将图放进内存的方法 常用的建图方式&#xff1a;邻接矩阵&#xff0c;邻接链表&#xff0c;链式前向星 一、邻接矩阵 通过一个二维数组即可将图建立&#xff0c;邻接矩阵&#xff0c;考虑节点集合 &#xff0c;用一个二维数组定义邻接矩…

迭代器模式(行为型)

目录 一、前言 二、迭代器模式 三、总结 一、前言 迭代器模式(Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;提供一种方法顺序访问一个聚合对象中各个元素&#xff0c;而又不暴露该对象的内部表示。总的来说就是分离了集合对象的遍历行为&#xff0c;抽象出…

gcc -m32 一堆报错:No such file or directory

问题&#xff1a;终端执行命令gcc -m32 *.c -o xxx.so 出现一堆缺失文件的报错。 解决办法&#xff1a;库没装全&#xff0c;终端执行下面的命令。 sudo apt install gcc-multilib

【设计模式】JAVA Design Patterns——Command(事务模式)

&#x1f50d;目的 将请求封装为对象&#xff0c;从而使你可以将具有不同请求的客户端参数化&#xff0c;队列或记录请求&#xff0c;并且支持可撤销操作。 &#x1f50d;解释 真实世界例子 有一个巫师在地精上施放咒语。咒语在地精上一一执行。第一个咒语使地精缩小&#xff0…

LabVIEW步开发进电机的串口控制程序

LabVIEW步开发进电机的串口控制程序 为了提高电机控制的精确度和自动化程度&#xff0c;开发一种基于LabVIEW的实时、自动化电机串口控制程序。利用LabVIEW软件的图形化编程特性&#xff0c;通过串口实时控制电机的运行参数&#xff0c;实现电机性能的精准控制与评估。 系统组…

nginx+nginx-http-flv-module在Linux服务器搭建

需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module &#xff0c;但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的&#xff0c;前者拥有的功能后者都有&#xff0c;后者是国内的开发开…

基于PostGIS的mvt动态矢量切片的后台地图服务和前端调用

目录 一、背景 二、矢量切片 三、Mapbox的矢量切片格式 四、PostGIS生成矢量切片 ST_AsMVT: ST_AsMVTGeom: 五、导入试验数据 六、编写PostGIS函数 七:Java后端实现 八、Openlayers前端调用 一、背景 矢量切片技术目前已成为互联网地图的主流技术,无论是Mapbox还…

Vue.Draggable:强大的Vue拖放组件技术探索

一、引言 随着前端技术的不断发展&#xff0c;拖放&#xff08;Drag-and-Drop&#xff09;功能已经成为许多Web应用不可或缺的一部分。Vue.js作为现代前端框架的佼佼者&#xff0c;为开发者提供了丰富的生态系统和强大的工具链。Vue.Draggable作为基于Sortable.js的Vue拖放组件…

Slash后台管理系统源码阅读笔记 后面面板中的折线图统计卡片是怎么实现的?

之前的笔记发表在博客和公众号以后&#xff0c;得到了一部分同学的喜爱的认可&#xff0c;所以今天继续。 目前这个管理系统的代码已经处理了一小部分&#xff1a; 接下来&#xff0c;我们看看第二栏那三个折线图统计卡片是怎么实现的。 这三个卡片还是使用的 antd 一行三列…

2024年电工杯高校数学建模竞赛(A题) 建模解析| 园区微电网风光储协调优化配置

问题重述及方法概述 问题1&#xff1a;各园区独立运营储能配置方案及其经济性分析 经济性分析采用成本-效益分析方法&#xff0c;计算购电量、弃风弃光电量、总供电成本和单位电量平均供电成本等指标。 问题2&#xff1a;联合园区储能配置方案及其经济性分析 经济性分析采用成…