JNI 使用案例详解(一)

2023-05-16

  很久没有写博客了,今天来写一下关于在android开发过程中使用JNI的详细案例及操作步骤。

首先,JNI,我的理解,他就是java和C之间的桥梁,很多写C++和JAVA的人不会写JNI,因为这两个方向的人,正常情况下都不会去用JNI来做什么,只有一些功能需要在C层来完成,而java层只是用来调用C层实现的代码逻辑的时候,就需要使用JNI来完成这部分工作了。

第一,首先我们说C层的实现:

首先,C++ 我们创建文件时,会生成两个文件,例如,我们命名为:TestCommitDemo.cpp,一个是.h文件,一个是.cpp 文件,这两个文件,一个是用来声明的,一个是用来实现的。我们在cpp内写了一个TestCommit()方法,需要java在适当的时机,来调用这个testCommit方法。那这时,我们就需要使用JNI文件来把这个方法转给java来实现了。

JNI文件同样的,创建的时候也是两个文件.h和.cpp 文件。例如,我们创建了两个文件,JNITest.cpp和JNITest.h 两个文件

JNITest.h

class JNITest {

};


JNITest.cpp

#include "JNITest.h"

以上就是创建完成之后两个文件的内容。

然后,我们就开始把TestCommit()方法传递出去。首先,我们得知道,我们需要在哪里调用这个TestCommit方法。比如我们需要在TestActivity类中,调用这个方法。

那在JNITest.h 中可以声明这个方法

JNIEXPORT void JNICALL Java_com_test_code_TestActivity_TestCommit(
        JNIEnv *env, jobject obj);

说明一下方法名和参数,JNIEXPORT 和JNICALL都是固定的,void表明这个方法不需要有返回值,若有返回值,可参考一下 几种类型,jint,jstring....之类的。

其次,Java_com_test_code_TestActivity_TestCommit 为JNI的方法名com_test_code_TestActivity

com_test_code 为你的包名,TestActivity 为你要调用c++中的方法名的类名。TestCommit 为方法的名称。至此,JNITest.h 中就可以完成了。剩下的就是JNITest.cpp 中如何实现这个方法了。
 

 JNIEXPORT void JNICALL Java_com_test_code_TestActivity_TestCommit(
        JNIEnv *env, jobject obj){

    TestCommitDemo testCommitDemo;
    testCommitDemo.testCommit();
}

 如上,我们创建了TestCommitDemo,用此对象来调用testCommit()方法。注意,.h 和 .cpp 内的两个方法名必须一模一样。至此,我们完成了JNI层和C层的全部代码。下面,我们就完成Java层的部署

1.因为我们项目中含有c文件,所以,不论我们是使用mk文件也好,使用cmake文件也好,总之, 都需要把c的代码进行编译,那编译的c模块的名称即 LOCAL_MODULE ,


System.loadLibrary("LOCAL_MODULE名称");  

至此,我们就可以和我们的c部分绑定到一起了。

2.我们把JNI中相同的名称写入到java文件中,例如:private native void testCommit();

注意,一定要有native,这样才能调到JNI中声明的方法。

3.在适当的时机,即需要调用此方法的地方,java中调用即可实现。

over

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNI 使用案例详解(一) 的相关文章

  • Android 之JNI 报错(一)

    今天导入了一个以前的项目 xff0c 结果各种报错 xff0c 这里记录一下 项目是一个使用到JNI的项目 xff0c 在项目中我就重新回顾一下 1 因为我知道项目使用到了JNI xff0c 所以直接到 local properties中修
  • eclipse报错:Failed to load the JNI shared library

    电脑自装系统以来 xff0c 好久没有写java代码了 xff0c 所以一直也没用 eclipse IDE xff0c 今天将eclipse打开 xff0c 报了个问题 xff0c Failed to load the JNI shared
  • Java使用JNI自定义native方法(C++方法)

    IDE版本 xff1a IntelliJ Idea 2019 Visual Studio 2019 JDK版本 xff1a JDK 1 8 1 xff09 使用idea创建一个简单的java项目NativeTest 如下 xff1a Mai
  • 通过示例去看JNI中为什么使用extern “C“

    经验总结 在JNI开发过程中 xff0c 我们使用C 43 43 去写一个动态库 xff0c 由于C 43 43 编译器对于函数的符号的生成需要进行名字修饰处理 xff0c 然后生成的函数符号不再跟源代码中定义的函数名一致 这样导致调用方通
  • android中jni详细,Android中的JNI使用简介

    一 本文说明 本文不对Android工程的各种配置做说明 xff0c 只是简单介绍下开发过程中如何进行C与Java互相调用以及出现异常情况的处理 二 NDK简介 Android NDK 是一套允许您使用 C 和 C 43 43 等语言 xf
  • Android通过jni调用本地c/c++接口方法总结

    网上有网友问android的原生应用 xff0c 上层java代码如何通过jni调用本地的c c 43 43 接口或第三方动态库 xff1f 之前搞过android应用开发和底层c c 43 43 接口开发都是一个人搞定 xff0c 觉得还
  • JNI开发C调用Java的方法和构造函数(三)

    前言 JNI的基本使用 xff0c C中调用Java的成员变量 xff0c 成员属性 xff0c 构造方法 xff0c 方法 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 JNI的上下文 xff1f 大家知道在
  • Android:JNI调用C++自定义类的详细方法

    一般情况下 我们都是用 JNI 调用 C 的某个方法的代码 包括直接使用 android studio 生成的代码也是如此 但有时我们需要新建 或者得到的是 C 的一个自定义类 在调用时就不能像调用 C 方法那样了 查阅了一部分其他人的博客
  • Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用

    前言 一直觉得无论是从行业形式来看 还是从就业角度说 学习JNI NDK开发是一条必经之路 很多说Android和IOS几乎没有市场了 其实只能说现在开发APP的需求没那么多了 再加上之前培训机构疯狂向市场输出Android IOS开发人员
  • 关于Java调用dll的方法

    Java语言本身具有跨平台性 如果通过Java调用DLL的技术方便易用 使用Java开发前台界面可以更快速 也能带来跨平台性 Java调用C C 写好的DLL库时 由于基本数据类型不同 使用字节序列可能有差异 所以在参数传递过程中容易出现问
  • 在C/C++中调用Java代码

    JNI就是Java Native Interface 即可以实现Java调用本地库 也可以实现C C 调用Java代码 从而实现了两种语言的互通 可以让我们更加灵活的使用 通过使用JNI可以从一个侧面了解Java内部的一些实现 本文使用的环
  • java中native的用法

    Java开发中会碰到声明为 native的方法 如 public native int hashCode 这是一个native方法 为什么存在native方法呢 Java不是完美的 Java的不足除了体现在运行速度上要比传统的C 慢许多之外
  • Android解决调用JNI报java.lang.UnsatisfiedLinkError: No implementation found for的错误

    最近公司项目需求接入即时通讯功能 现在第三方的即时通讯做的比较完善 接入也很方便 最近在调试语音的时候遇到了一个 so库加载失败的问题 在网上查看都是说由于原有项目的so库和新添加的model的so库数量不一致 具体报错如下 java la
  • Attention! No symbol directories found - please check your native debug configuration</font>

    我出现问题的版本是Android Studio2 2 3 之前项目是正常的 可以调试JNI代码 但是突然有一次不知道什么原因就无法调试 断点无法断下 调试时有这样的警告 Now Launching Native Debug Session
  • java.lang.UnsatisfiedLinkError: No implementation found for

    E AndroidRuntime FATAL EXCEPTION main Process com example pimr PID 20314 java lang UnsatisfiedLinkError No implementatio
  • C语言基础入门详解二

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 一 C语言多级指针入门 include
  • android studio中的CMakeLists.txt,就是如此简单

    android studio中的CMakeLists txt 就是如此简单 user Linvest 目录 1 cmake minimum required VERSION 3 4 1 2 add library native lib SH
  • Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤

    1 打开新立得包管理器 搜索JDK 选择openjdk 6 jdk安装 2 打开Ubuntu软件中心 搜索Eclipse 选择Eclipse集成开发环境 安装 3 打开Eclipse File gt New gt Java Project
  • android通过JNI用C/C++创建本地文件

    通过jni在本地创建文件 1 在android studio创建基本的jni工程 并且在APP界面成功显示 Hello from C 不会的可以看android studio使用jni 2 在native lib cpp文件中创建文件 为了
  • Android中JNI在C/C++中的区别

    一 一个疑问 在进行JNI编程中 同样一个函数FindClass C和C 中有不同的用法 如果是C 要用 env gt FindClass str 如果是C要用 env gt FindClass env str 类似的区别几乎涉及到每一个结

随机推荐

  • APQP(advanced product quality planning先期产品质量策划)

    APQP xff08 advanced product quality planning先期产品质量策划 xff09 xff0c 圈子里面无论是做研发 做项目还是做SQE的都不陌生 xff0c 很多时候 xff0c 尤其是SQE会比较困惑
  • 8D和A3报告

    8D和3A报告 xff0c 他们都不仅仅是记录问题的一种文书 xff0c 而是解决问题的工具 A3发展于TPS xff08 Toyota Production system xff09 xff0c 可以用来解决问题 xff0c 沟通 xff
  • Ubuntu出现包依赖错误的解决方法

    大家在使用apt get安装软件时经常会出现这种包依赖错误 这主要是因为apt get的源中没有所要安装的package的依赖包 主要有以下两种解决方案 xff1a xff11 将CD加入Ubuntu的apt get源 参见我的另一篇博客
  • stm32 类型转换

    stm32怎么把uint8 t类型转换成int类型 可以使用强制类型转换 xff1a int n 61 int uint8 t 参考例子 xff1a include lt stdio h gt int main void uint8 t a
  • C语言不带头结点链表创建,删除,插入总结

    一 创建链表 1 第一种创建链表的方法 xff0c 注意对比和第二种创建链表的细微之处 xff0c typedef struct mynode int num float score struct mynode next Node Pnod
  • http协议基本认证 Authorization

    http协议是无状态的 xff0c 浏览器和web服务器之间可以通过cookie来身份识别 桌面应用程序 比如新浪桌面客户端 xff0c skydrive客户端 跟Web服务器之间是如何身份识别呢 xff1f 阅读目录 什么是HTTP基本认
  • Java 中大小端 int 与 byte 数组转换

    1 小端模式转换 1 1 int 转 byte 数组 xff0c 低位在前 xff0c 高位在后 将int数值转换为占四个字节的byte数组 xff0c 本方法适用于 低位在前 xff0c 高位在后 的顺序 和bytesToInt xff0
  • 无人机/FPV穿越机航模的遥控器/接收机等配件厂商

    本人最近迷恋上了穿越机 整理一些资料 xff0c 方便后来人学习 有其他更新资料 xff0c 欢迎留言 xff0c 争取打造成好的工具书 新手入门可以看百科 xff1a http wiki fpvbang com 穿越机电子系统表 xff1
  • FPV穿越机一启动就加速翻滚(死亡翻滚)解决办法

    最近不是开始入坑穿越机吗 xff0c 买了一个moblite7玩玩 xff0c 碰到了这个问题 大家在购买其他穿越机 xff0c 或者自组穿越机 xff0c 还有重置了穿越机的设置好 也很有可能碰到问题 xff0c 我把自己搜索并解决这个问
  • Python读取Microsoft Access Database

    公司有一个小零件进出库管理系统 xff0c 数据库是使用Microsoft Access Database xff0c 因长期存储会有生锈问题 xff0c 导致零件报废 因此基于原数据的进库出库在库数据 xff0c 做一个python脚本
  • Android13 新特性和开发适配须知

    前言 目前 Google 已经发布了 Android 13 的正式版 xff0c 虽然国内的手机能用上 Android 13 还有一段时间 xff0c 不过开发者们可以通过模拟器来体验 xff0c 那么我们来看看 Android 13 都有
  • ./configure 的配置和用法

    Linux环境下的软件安装 xff0c 并不是一件容易的事情 xff1b 如果通过源代码编译后在安装 xff0c 当然事情就更为复杂一些 xff1b 现在安装各种软件的教程都非常普遍 xff1b 但万变不离其中 xff0c 对基础知识的扎实
  • JDK1.8(jdk8.0)新特性

    Java is still not dead and people are starting to figure that out 本教程将用带注释的简单代码来描述新特性 xff0c 你将看不到大片吓人的文字 一 接口的默认方法 Java
  • MQTT协议通俗讲解

    参考 Reference 协议文档 Offical Docs v3 1 1 英文原版 中文翻译版 其他资源 网站 MQTT官方主页 Eclipse Paho 项目主页 测试工具 MQTT Spy xff08 基于JDK xff09 Chro
  • mqtt实现库对比

    发现一片非常好的文章 xff0c 从17个方面 xff0c 介绍几个分布式消息队列系统 xff0c 非常棒的内容 xff0c 方便做技术选型 xff0c 平衡各种 xff1a 17 个方面 xff0c 综合对比 Kafka RabbitMQ
  • 几种直播流媒体协议

    题外话 xff1a HTTP渐进下载流媒体播放 基于TCP yy 乐视 爱奇艺 优酷土豆 搜狐视频 花椒直播 xff0c 主要还是通过rtmp amp hls来实现的 xff0c 但他们也意识到rtmp的天生缺陷 xff0c 所以不管是技术
  • Android9.0(androidP)系统API和行为变化

    这篇文章 xff0c 是Android官方文档的中文版本 注意事项 xff08 AndroidP 特性 xff09 xff1a 1 android os Build VERSION RELEASE xff0c 需要当做字符串类型处理 2 依
  • Android version名称,版本号,API level,代号 表(updateing)

    系统版本OS Version 版本号API level 发布日期release Date 发布代号nick Name 主要特性feature android1 0 API1 2008 10 android1 1 API2 2009 2 an
  • Android10.0(Q)新特性和行为变更

    Android Q 还为开发者们带去了许多新功能 xff0c 如折叠屏增强项 新网络连接 API 全新的媒体解码器 摄像头新功能 NNAPI 扩展 Vulkan 1 1 图形支持等等 2019 4 Beta2版本发布 点击查看Google官
  • JNI 使用案例详解(一)

    很久没有写博客了 xff0c 今天来写一下关于在android开发过程中使用JNI的详细案例及操作步骤 首先 xff0c JNI xff0c 我的理解 xff0c 他就是java和C之间的桥梁 xff0c 很多写C 43 43 和JAVA的