Android开发 -- JNI开发

news2024/9/8 10:41:17

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.coloradmin.cn/o/1703661.html

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

相关文章

电流采样(分流器与霍尔传感器)

在对于电信号采集的设计中&#xff0c;其中对电流信号的采集是非常常见的&#xff0c;根据电流信号的属性&#xff0c;如信号大小、信号周期等因素&#xff0c;以及采样的需求指标不一样&#xff0c;往往需要选择不同的采样方式进行采样。 下面主要介绍分流器和霍尔元件采样电…

【漏洞复现】号卡极团分销管理系统 ue_serve.php 任意文件上传漏洞

0x01 产品简介 号卡极团分销 管理系统&#xff0c;同步对接多平台&#xff0c;同步订单信息&#xff0c;支持敢探号一键上架&#xff0c;首页多套U|商品下单页多套模板&#xff0c;订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定&#xff0c;内置敢探号、172平台…

写好的文章怎样联系媒体投稿?

作为单位信息宣传的桥梁,我肩负着将单位的每一次活动、每一项成就转化为社会认可与赞美的重任。初涉此职,我满腔热血,以为凭借扎实的文字功底与不懈的努力,便能在各大媒体平台上为单位赢得一席之地。然而,现实很快就给了我一记响亮的耳光。 我最初采取的是最直接的方式——邮箱…

win10/win11 优先调用大核的电源计划性能设置

前言 大小核&#xff0c;即Intel 12代开始的P-core&#xff08;性能核&#xff0c;一般叫大核&#xff09;和E-core&#xff08;能效核&#xff0c;一般叫小核&#xff09;异核架构。说下个人理解&#xff0c;就是英特尔为了增加cpu性能&#xff0c;但是又因为架构和功耗的限制…

微信小程序上传包过大的最全解决方案!

微信小程序的发布大小限制是2MB。然而一个程序怎么能这么小&#xff1f; 介绍一下项目中的经验。 新项目 如果是刚开始做的新项目&#xff0c;一定确定好自己要用的Ui框架&#xff0c;而且确定之后&#xff0c;千万不要引入别的&#xff0c;否则占大小&#xff01;&#xff0…

人类行为验证处理方案 —— 脱离UI组件库实现登录、注册+表单校验

目录 01: 构建登录模块基础UI结构 02: 表单校验实现原理与方案分析 表单校验的实现原理 自定义表单校验方案分析 文章中的方案实现 03: 基于 vee-validate 实现普适的表单校验 04: 什么是人类行为验证&#xff1f;它的目的、实现原理、构建方案分别是什么&am…

three.js官方案例webgl_loader_fbx.html学习

目录 1.1 添加库引入 1.2 添加必要的组件scene,camera,webrenderer等 1.3 模型加载 1.4 半球光 1.5 动画 1.6 换个自己的fbx模型 1.7 fbx模型和fbx动画关联 1.7 html脚本全部如下 1.8 fbx.js全部脚本如下 1.1 添加库引入 import * as THREE from three; import Stats …

AI重塑了我的工作流

阅读内容 Inhai: Agentic Workflow&#xff1a;AI 重塑了我的工作流 4 种主要的 Agentic Workflow 设计模式 Reflection&#xff08;反思&#xff09;&#xff1a;让 Agent 审视和修正自己生成的输出。 举例&#xff1a;如果有两个 Agent&#xff1a;一个负责 Coding&#…

【加密与解密(第四版)】第十二章笔记

第十二章 注入技术 12.1 DLL注入方法 在通常情况下&#xff0c;程序加载 DLL的时机主要有以下3个&#xff1a;一是在进程创建阶段加载输入表中的DLL&#xff0c;即俗称的“静态输人”;二是通过调用 LoadLibrary(Ex)主动加载&#xff0c;称为“动态加载”&#xff1b;三是由于系…

实现UI显示在最上面的功能

同学们肯定遇到过UI被遮挡的情况&#xff0c;那如何让UI显示在最前面呢&#xff0c;先看效果 原理:UI的排序方式是和unityHierarchy窗口的层级顺序有关的&#xff0c;排序在下就越后显示&#xff0c;所以按照这个理论&#xff0c;当我们鼠标指到UI的时候把层级设置到最下层就好…

小猪APP分发:一站式免费应用推广的理想平台

在日益拥挤的移动应用市场中&#xff0c;对于独立开发者和新兴应用而言&#xff0c;找到一个高效且成本效益高的分发渠道至关重要。这正是小猪APP分发平台www.appzhu.cn脱颖而出的原因&#xff0c;它不仅提供了一个全面的解决方案&#xff0c;帮助开发者免费推广他们的应用程序…

宠物空气净化器终极PK,霍尼韦尔、小米、希喂哪款去浮毛最厉害?

宠物毛发和浮毛问题几乎困扰着每一个热爱动物的家庭。宠物的毛发不仅会附着在家具、地毯和衣物上&#xff0c;还可能引起过敏反应&#xff0c;特别是对于那些对宠物毛发敏感的人来说。此外&#xff0c;宠物毛发还可能携带细菌和尘螨&#xff0c;进一步影响家庭环境的清洁和健康…

【讲解下Web前端三大主流的框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

一、模块资料 &#xff08;1&#xff09;模块简介 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本&#xff0c;增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件…

【简单介绍下容器是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

001.数据分析_NumPy

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

如何根据系统的业务场景需求定制自己的线程池?

如何根据系统的业务场景需求定制自己的线程池? 1、背景2、生产中应当如何使用线程池才比较合理呢?2.1、指定线程数量2.2、选择合适的工作队列2.3、自定义线程工厂2.4、选择合适的拒绝策略3、自定义线程池代码案例1、背景 线程池有那么多的参数和类型,在实际的开发中,我们应…

【安装】VMware虚拟机安装windows操作系统,VM的相关操作

目录 引出报错&#xff1a;press any key to boot form cd激活调整显示 在VMware上新建虚拟机&#xff0c;并安装Windows1、新建虚拟机2、装载 ISO 镜像3、安装Windows server 20164、开机初始化 虚拟机操作1、虚拟机基本操作2、虚拟机快照3、虚拟机克隆4、VMware Tools 总结 引…

2024.5.22 关于 SpringCloud —— Nacos 配置管理

目录 Nacos 配置统一管理 Nacos 配置热部署 Nacos 多环境配置共享 配置优先级 Nacos 配置统一管理 实例理解 我们想要利用 Nacos 在 user-service 的 application.yml 配置文件中新增配置项此处我们将新增配置日期格式为 yyyy-MM-dd HH:mm:ss下图为新增 Nacos 配置统一管理…

Latex公式编辑:在矩阵内画横线与竖线

在LaTeX中&#xff0c;要在矩阵内绘制横线和竖线&#xff0c;我们通常使用array或matrix环境&#xff0c;并结合\hline&#xff08;用于横线&#xff09;和|&#xff08;用于竖线&#xff09;来实现。但需要注意的是&#xff0c;\hline通常用于表格环境中。 LaTeX中绘制分块矩阵…