从场景和需求梳理JNI接口

Java调用C/C++的开发库的几种常见手段梳理 背景 最近在做一个与硬件和第三方平台有关的项目,平台厂商扔过来一个DLL,但我方平台是Java编写的所以需要实现Java调用C的DLL。特此做了一些调研,现在记录一下。 主要实现途径 脚本 其实Java调用其他程序最简单的方式就是直接通过shell或是bat脚本调用,但这只局限于一些简单没有交互的应用,这里就不展开讨论。 JNI 简单介绍 JNI是Java Native Interface的缩写,... 阅读详情

1 真实的情景和互动的对象

都有哪些Java和C交互的场景?真实的场景是:
1、一个C程序被系统加载并运行(比如java.exe)
2、C程序加载Java虚拟机并运行一个Java类(这个动作使用Invocation API接口)
3、有可能,这个运行的Java类需要加载一个C库(通过System.loadLibrary函数),C库代码和这个Java类互动,包括互相调用函数和访问变量(这个是通常所言的JNI,通过env指向的函数列表来实现相互操作)

其中第二个场景有互动需求,注意依赖关系是C加载Java。其中第三个场景有互动需求,注意依赖关系是Java加载C。

哪些可以互动?必须是某种实体。
     C侧:
          变量
          函数
     Java侧:
          对象
          对象的公有方法和变量
          类的静态方法和静态变量

上述个体都可能成为互动的对象,只有方法或函数可以成为互动的发起者

至此我们理清楚了互动情景。下面我们来梳理互动的操作细节


2 第三个场景,Java代码加载C代码

根据场景来区分。先研究第三个场景,也即Java代码加载C代码。

2.1 可能的互动

Java代码加载C代码时可能出现的互动:
     Java访问C侧
          看到的范例是Java调用C函数
          Java可以访问C变量吗?未知,细节留待以后研究
          C可以有全局或静态变量吗?可以
          C可以重入吗?未知,取决于C侧代码设计

     C访问Java侧
          C可以通过JNI接口查找和访问Java侧类
          C可以通过JNI接口调用Java侧类构造方法,用以生成对象
          C可以通过JNI接口访问Java侧对象的变量和方法
          C可以通过JNI接口访问Java侧类的静态变量和静态方法

2.2 Java访问C侧

Java侧访问C侧函数的找寻方法:
1、通过函数原型匹配,注意函数原型是通过函数名和其他信息一起组合生成的
2、通过注册函数直接强制链接。注意C库中的JNI_OnLoad()会被自动和首先调用,可以在其中注册和链接

函数原型样式:
     JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *, jobject, jstring)

     JNIEnv指向JNI接口的功能函数表,表中各种函数往往用来转换数据,或者访问其他
     如果是C++,可以省略掉这个参数
     jobject指向调用的发出者,说明这里是对象发出对C的调用。如果是类的静态方法在调用C代码的话,这里是jclass。
     jstring是一个参数示例


2.3 C访问Java侧

实质是,plain的C代码怎样访问用对象封装的Java元素
怎样访问一个Java类的变量和方法?首先是这些资源被编码了,并生成了签名,可以根据签名去索引。

可能的访问
     C可以访问JNI接口函数,当然JNI接口函数也就是为C准备的
     C可以通过JNI接口函数查找和访问Java侧类
     C可以通过JNI接口函数调用Java侧类构造方法,用以生成对象
     C可以通过JNI接口函数访问Java侧对象的变量和方法
     C可以通过JNI接口函数访问Java侧类的静态变量和静态方法

有哪些因素在访问中需要考虑?
1、双方有不同的基本数据类型,包括各种char、int、long等等,需要使用一个统一的本地类型:jchar、jint、jlong
2、Java有类和对象的概念,还有String,但C只有plain string,因此C侧需要从Java对象中抽取数据,或组合plain数据为Java对象
以上转换都通过调用JNI接口函数来实现,也即函数原型中“JNIEnv * env”参数所指向的函数列表

3 第二个场景,C代码加载Java代码

在C程序中运行Java类,即Invocation API

两个用途实例:
1、java.exe由C语言编写,通过Invocation API执行Java类
2、Android系统Launcher加载dalvikvm

加载过程一共7步
     1.生成java虚拟机选项
     2.生成java虚拟机
     res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
     3.查找并加载类
     cls = (*env)->FindClass(env, "InvocationApiTest");
     4.获取main()方法的ID
     mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
     5.生成字符串对象,用作main()方法的参数
     6.调用main()方法
     (*env)->CallStaticVoidMethod(env, cls, mid, args);
     7.销毁Java虚拟机
     (*vm)->DestroyJavaVM(vm);


4 一些JNI接口细节

值得关注的有:
1、JNI函数列表里面都有什么?
大体如下三类:
     类、对象、变量、方法等的引用及操作
     字符串、数组操作
     虚拟机接口、异常、C和Java之间函数关联
2、怎样查看方法和变量等的签名?
可以使用javap.exe进行签名。不过看几个范例几乎也能猜出来。

3、局部和全局引用
C侧可以获取Java侧实体的引用,缺省是局部应用,函数退出后即失效。一直有效的话可以使用全局引用。
显然,引用不是一个简单的指向实体的指针,不然怎么会失效呢?

5 参考文档

1、The Java Native Interface Programmer's Guide and Specification
2、Java Native Interface Specification
3、《Android框架揭秘》[韩]金泰延

前面两篇是官方的专业文档,有所有细节,但是看起来头疼且太耗时间,没有必要。《Android框架揭秘》一书对JNI做了很细致很易懂的而且足够的介绍。此书各部分都写得非常仔细,甚至略有啰嗦,各处都有自己的的整理或见解,可以看出作者写书非常的认真尽责,不是拷贝粘贴,所以在此我要大力推荐这本书。



Android应用集成OpenSSL:从编译到JNI封装的安全通信实践 SSL/TLS协议是保障网络通信安全的基石,它通过非对称加密、对称加密和哈希算法相结合,在客户端与服务器之间建立加密通道,确保数据传输的机密性、完整性和身份认证。在移动开发领域,Android系统虽然提供了内置的网络安全API,但在处理自定义证书校验、特定加密套件或私有协议时,开发者往往需要更底层的控制能力。OpenSSL作为业界广泛使用的开源加密工具库,提供了完整的TLS/SSL协议实现和丰富的密码学原语,能够满足高级安全需求。通过将其集成到Android应用中,开发者可以灵活定制TLS版本、实现双向认证 阅读详情

相关推荐

Android Framework开发面试指南与参考答案

摘要:本文针对蜂助手安卓Framework开发职位要求,提供了系统化的面试准备指南。将任职资格划分为编程语言与工具、IPC与本地开发、Framework架构、模块处理流程、安全技术和平台经验六大核心技能模块,每个部分均列出典型面试问题并附专业参考答案。答案涵盖Java/C++应用场景、Binder机制、音频处理流程、SELinux策略调试等关键技术点,结合复杂度分析和数学表达式(如O(nlogn))说明性能优化方法,并对比Android9-13版本特性差异,为应聘者提供全面的技术复习框架和实战应答策略。

郑伟强dev的专栏 1037

Java使用JNI介绍、应用场景和示例代码

与本地代码交互:当需要调用系统底层的 API,或者需要执行一些用 Java 语言无法完成的任务时,可以通过 JNI 进行交互。提高性能:某些计算密集型操作可能在本地代码中比在 Java 中更高效。重用已有代码:在项目中复用已有的 C/C++ 库而不是重写 Java 版本。

a_beiyo的博客 843

保姆级教程:用Python从UCI下载波士顿房价数据集,手把手跑通线性回归、岭回归和Lasso

本文提供了一份保姆级教程,详细讲解如何用Python从UCI下载波士顿房价数据集,并手把手实现线性回归、岭回归和Lasso回归模型。内容涵盖数据获取、清洗、特征分析到模型构建与评估的全流程,特别适合机器学习初学者掌握波士顿房价预测这一经典案例。

weixin_34254848的博客 478

Java JNI 编程进阶

JNI一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,JNI技术的出现主要是基于三个方面的应用需求:   1. 解决性能问题Java具有平台无关性,这使人们在开发企业级应用的时候总是把它作为主要候选方案之一,但是性能方面的因素又大大削弱了它的竞争力。为此,提高Java的性能就显得十分重要。Sun公司及Java的支持者们为提高Ja...

甘谷天蚕网络技术有限公司 292

SAP ABAP实战:用GN_DELIVERY_CREATE批量创建内部交货单的完整代码与避坑指南

本文详细介绍了在SAP ABAP开发中使用GN_DELIVERY_CREATE函数批量创建内部交货单的完整实现方案。通过数据结构设计、多源数据整合、批量处理逻辑和错误处理机制等核心环节的深入解析,帮助开发者高效完成物流单据自动化处理,特别针对VL31N/VL32N等常见场景提供避坑指南。

weixin_42116058的博客 343

使用DDR4控制器实现多通道数据读写

这种高带宽对于大量的数据的应用非常重要。对于Controller/PHY Mode 的选择,我们使用Controller + PHY模式,Xilinx UltraScale/UltraScale+等高端FPGA通常包含硬核PHY,选择Controller + PHY模式可直接利用硬核,降低功耗和延迟,并且此模式的开发更易上手。在Basic页面下,首先勾选上AXI4 Interface选项,我们选用的内存接口速度为2133MHz的ddr4芯片,由于双沿触发,频率为1066MHz,那么周期应为938ps。

weixin_38828382的博客 1364

ANDROID JNI的使用简介

ANDROID JNI的使用简介 Android平台的框架图[编辑]JNI的使用场景 我们从上图可以看到Android上层的Application和Application Framework都是使用Java编写,底层包括系统和使用众多的Libraries都是C/C++编写的。 所以上层Java要调用底层的C/C++函数库必须通过Java的JNI

csh86277516的博客 1172

蓝牙开发实战:如何用Wireshark抓取HCI协议包(附完整分析步骤)

本文详细介绍了如何使用Wireshark抓取和分析蓝牙HCI协议包,包括环境搭建、过滤器配置技巧、数据包深度解析及高级调试方法。通过实战案例,帮助开发者快速定位蓝牙连接问题,提升调试效率。

cuda7parallel的博客 1149

Java JNI实现原理初探

前言 写这个是出于好奇。 我们知道cpu只认得 "0101101" 类似这种符号, C、C++ 这些代码最终都得通过编译、汇编成二进制代码,cpu才能识别。而Java比C、C++又多了一层虚拟机,过程也复杂许多。Java代码经过编译成class文件、虚拟机装载等步骤最终在虚拟机中执行。class文件里面就是一个结构复杂的表,而最终告诉虚拟机怎么执行的就靠里面的字节码说明。 Ja

最帅惋红曲 2万+

安卓逆向实战:用Batch Apktool 3.8.0快速汉化APK的完整流程

本文详细解析了如何使用Batch Apktool 3.8.0进行安卓APK汉化的完整流程,包括环境配置、反编译、资源解析、深度汉化、重构建与签名优化等关键步骤。通过这款集成化逆向工具,开发者可以高效完成APK汉化,提升工作效率。

s1t2u3的博客 1100

论文分栏前后内容不连续?教你word如何删除分节符

问题 当我们在写论文的时候,很多期刊的模板都是两栏的格式,但有的时候我们插入的图像尺寸可能太大,两栏格式放不下,因此需要将其以一栏的格式出入,如下: 但当我们把图片删除后,再将其转换成两栏格式,前后内容就出现不连续的情况: 正常情况下应该是如下: 正确处理方式 里面有个分页符,把分页符去掉,或者把你的文字全部复制到记事本里,然后重新复制回word就可以取消原有的格式了。 删除分节符的方法(以word 2019为例) -点击菜单栏上的“视图”,点击“大纲视图”。 可以看到word文档以整列的形式展开:

左手の明天的博客 1万+

java jni使用场景_Windows端的java程序使用jni调用C++编写的库

Windows端的java程序使用jni调用C++编写的库,原来实现过在Android和Linux端通过JNI调用C++程序,在Windows端没有实现过,这里记录下几个关键的点;1、64位的dll工程,现在少有32位的平台,所以需要通过VisualStudio编译出64位的dll,注意属性页->C/C++->代码生成/运行库/选择多线程调试(/MTd),参考Linux编译选项的静态链...

weixin_35796461的博客 258

光斑定位 - MATLAB实现

光斑定位是一种常见的图像处理任务,它涉及到在图像中准确定位光斑或亮点的位置。在本篇文章中,我们将使用MATLAB来实现光斑定位的算法,并提供相应的源代码。希望本文提供的MATLAB代码和步骤能够帮助您实现光斑定位任务。通过这些代码,您可以在MATLAB环境中轻松地定位光斑,并在图像上进行可视化展示。这样,我们就完成了光斑定位算法的MATLAB实现。通过以上步骤,我们可以得到一个在光斑位置上标记的图像,从而实现了光斑的准确定位。光斑定位 - MATLAB实现。

qq_39605374的博客 764

Android JNI 语法全解析:从基础到实战

摘要: JNI(Java Native Interface)是Android开发中连接Java与C/C++的关键技术,适用于音视频处理、硬件交互等高性能场景。本文系统讲解了JNI的核心概念、数据类型映射、方法注册(静态与动态)、内存管理(局部/全局引用)及常见操作(字符串、数组、对象交互)。重点分析了内存泄漏的预防策略(如及时释放引用)和调试技巧(日志与断点)。通过平衡性能与安全,开发者可高效利用JNI优化关键模块,同时避免崩溃和泄漏风险。掌握JNI能显著提升Android应用的底层能力,但需遵循“最小化使

weixin_37794278的博客 1289

华为od 面试八股文_测试/测试开发_01_含答案

华为od面试八股文_测试/测试开发_01_含答案

MISAYAONE的博客 3816

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JNI性能优化与跨平台应用开发

在当今的软件开发领域,Java作为一种广泛使用的编程语言,以其跨平台性和强大的库支持而备受青睐。然而,在某些特定场景下,Java的局限性也日益凸显。例如,当需要与本地库或硬件设备进行交互时,Java的纯虚拟机特性就变得力不从心。这时,JNI(Java Native Interface)应运而生,它为Java程序提供了与本地代码交互的桥梁。JNI的出现,源于对Java语言在特定领域应用局限性的反思。在图形处理、高性能计算、嵌入式系统等领域,Java的运行效率往往无法满足需求。

JavaCodePro的博客 1113

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从FreeReflection到JNI方案:Android隐藏API调用演进史

本文系统梳理了Android隐藏API调用限制的演进历程。从Android 9引入限制开始,详细分析了早期有效的套娃反射(FreeReflection)原理及其在Android 11因调用栈检查强化而失效的原因,并重点介绍了适用于Android 11及更高版本的JNI线程方案等实用绕过方法,为开发者应对非SDK接口访问提供了深入的技术解析与方案参考。

ff678的博客 211

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

把视觉算法部署到手机上有多难?我用DeepSeek 整出了一套自动闭环流程

从 Python 写好一个视觉模型,到它真正跑在安卓设备上,中间横跨: - 模型导出 → 模型转换(ONNX/TFLite/NCNN) - 推理优化 → 接口封装(JNI、NDK) → UI 演示 - 再到预处理、后处理、性能测试、脚本生成…… 整个过程不但耗时、繁琐,而且容易踩格式、兼容性、精度损失等坑。 本篇文章就带你实战一把:**如何用 DEEPSEEK 高效协助我们完成从 PyTorch → NCNN → Android 的完整部署路径**。 一套闭环流程搞定

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1516

Djinni生态系统:探索扩展库和社区资源的完整清单

想要构建跨平台移动应用?Djinni生态系统为你提供了完整的跨语言类型声明和接口绑定生成工具。这个强大的工具能够连接C++与Java或Objective-C,为你的多平台开发需求提供一站式解决方案。🚀 ## 🔧 核心扩展库概览 Djinni生态系统包含多个精心设计的扩展库,每个都针对特定的跨平台开发需求: ### 平台线程管理库 位于[extension-libs/platform-th

gitblog_00540的博客 992

新手必看!Java这21个技术点,JNI、RMI等超关键

Java新手必学的21个技术点 以下为大家盘点作为Java新手必学的21个技术点,希望能够对想要学习编程,学习JAVA的人有些帮助!

不忘初心,方得始终。不管前路如何艰难,只要心中有梦想,就有力量。 148

Frida主动调用实战:从Hook到操控的五大核心场景解析

在移动安全与逆向工程领域,动态插桩技术是实现应用行为分析和漏洞挖掘的关键手段。其核心原理是通过注入代码到目标进程,实现对运行时函数调用的拦截与监控。这项技术的核心价值在于,它允许安全研究人员和开发者在不修改源码的情况下,动态观察、修改甚至创造应用的执行逻辑,从而极大地提升了安全测试、协议分析和算法验证的效率。在实际应用中,动态插桩技术广泛应用于移动应用安全评估、恶意软件分析、游戏外挂检测以及物联网设备固件分析等场景。本文聚焦于Frida工具中的**主动调用**技术,深入探讨如何超越传统的被动Hook,实现对

weixin_30411239的博客 407
上一篇: 最简描述json数据
下一篇: 另类角度思考HTML5和原生APP之争
Max2005
博客等级 码龄22年 45粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值