1.简介
JNI是Java Native Interface的缩写,它的设计目的是:
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications
You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
2.JNI的书写步骤
编写带有native声明的方法的java类
使用javac命令编译所编写的java类
使用javah ?jni java类名生成扩展名为h的头文件
使用C/C++实现本地方法
将C/C++编写的文件生成动态连接库
ok
1) 编写java程序:
这里以HelloWorld为例。
代码1:
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。
Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
main()方法
2) 编译没有什么好说的了
javac HelloWorld.java
3) 生成扩展名为h的头文件
javah ?jni HelloWorld
头文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
4) 编写本地方法
实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
1 #include <jni.h>
2 #include "HelloWorld.h"
3 #include <stdio.h>
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为HelloWorldImpl.c就ok了。
5) 生成动态库
这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。
cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll
注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%/include -I%java_home%/include/win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
6) 运行程序
java HelloWorld就ok。^_^
相关推荐
springboot+shardingsphere+druid 实现基于时间的水平分表
使用shardingsphere基于时间字段的动态水平分片。
【JNI】javah命令详解
一,javah 用法 javah命令主要用于在JNI开发的时,把java代码声明的JNI方法转化成C\C++头文件,以便进行JNI的C\C++端程序的开发。 【注意】javah命令对Android编译生成的类文件并不能正常工作(??求验证??)如果对于Android的JNI要想生成C\C++头文件的话,可能只有先写个纯的java代码来进行JNI定义,接着用JDK编译,然后再用javah...
单窗算法的地表温度反演:谷歌地球引擎GEE代码
该论文基于Statistical Mono-Window(SMW)算法,对地表温度加以求解。其中,简单地说,SMW算法即是通过简单的线性关系,对由单热红外波段所得的大气表观亮温与地表温度之间的经验关系加以表示,从而计算得到LST。
javaJNI(javah用法)
目录 一、native关键字 二、javah命令 一、native关键字 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。 Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。 二、javah命令 1首先找到java文件目...
【面试经验】大疆笔试-计算机视觉算法B卷
3、a=np.random.randn(3,3) b=np.random.randn(3,1) ,那么c=a*b的维度应该是:*是元素乘法或者torch.mul,@才是矩阵乘法或者torch.matmul,不会触发广播机制;8、将分辨率降低一半时,精标定内参(fx、fy、cx、cy、k1、k2、k3)焦距、光心、畸变系数将分别变成(fx、fy、cx/2、cy/2、k1、k2、k3),只能搜到光心变成一半,畸变系数不变。12、KLT算法在频闪光源、重复纹理、高速机动、环境照度低的情况下效果显著下降。
为什么你的SSE连接总断?深入对比EventSource与fetch-event-source的5大差异点
本文深入对比了原生EventSource与@microsoft/fetch-event-source库在SSE连接稳定性上的五大关键差异。重点剖析了后者在请求能力、连接控制、错误处理、数据解析及性能优化方面的优势,特别是其支持POST请求、自定义Header、精细化的重连策略与生命周期管理,为解决生产环境中SSE连接频繁断开的问题提供了专业方案。
【Java可执行命令】(七)C头文件创建工具 javah:以Java本机接口(JNI)规范创建C头文件,深入解析创建工具javah ~
javah是一个有用的工具,可以方便地将 Java 类连接到 C/C++ 代码中。它允许开发人员通过生成 JNI 头文件来建立 Java 和本地代码之间的桥梁,实现高效的跨平台开发。尽管涉及一定的学习成本和复杂性,但对于需要与底层操作系统交互或提高性能的情况下,使用javah是一个很好的选择。
英飞凌Tricore实战系列导读
笔者结合项目应用经验对Tricore MCU的开发及应用经验进一步总结,成人达己,渡己渡人。
java .h文件_JNI中javah命令的使用,生成.h的头文件
cd D:\AndroidWork\NdkTest\bin\classesjavah -jni com.example.ndktest.MainActivity参考:http://blog.sina.com.cn/s/blog_6e4511450100yq3d.html最近一直在折腾这个JNI和Android NDK,今天通过javah生成h文件时遇到各种问题。不管是javah -classpat...
第4章-上下文管理-对话历史记忆系统与窗口优化-《Agentic AI 智能体应用开发》
当上下文窗口接近极限时,需要对已有内容进行压缩。压缩不是简单的截断——你需要保留核心语义,去除冗余。# Python: 对话摘要压缩# 使用 Haiku 做摘要任务,成本最低"""将一段对话历史压缩为摘要"""system="你是一个对话摘要专家。请生成简洁但有信息量的摘要。",f"'用户'
BES2810_best1702_best1702_ibrt_三者关系深度解析
一颗芯片的三个名字:BES2810、best1702 与 best1702_ibrt 关系深度解析
JNI/NDK入门指南之javah和javap的使用和集成
JNI/NDK开发指南之javah和javap的使用和集成 在前面的章节JNI/NDK开发指南之JNI数据类型,描述符详解中我们详细的讲解了数据类型,描述符等相关的概念。如果是刚开始接触JNI的话,读者看到那些概念都会懵逼了,哇开发一个JNI的端咋这么多需要记忆的概念,描述符啊,数据类型啊,签名啊?其实JDK的开发工具为我们提供了一些快捷的工具如javah和javap,这两个...
高温环境下(100℃以上)相机的几种保障方案
高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)
Android JNI 技术入门指南
JNI是 Java 与其他编程语言(通常是 C 或 C++)之间的接口,允许 Java 代码与底层的本地代码进行交互。通过 JNI,我们可以在 Java 代码中调用本地(native)方法,或者让本地代码调用 Java 方法。之前一直对JNI望而却步,真正学过后回头看看,也不是那么的难,难的是你不主动去学。所有伟大,都源于一个勇敢的开始!共勉!
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
JNI快速入门
JNI快速入门 JNI为Java Native Interface 即Java本地接口,使用此种机制可以实现Java和C/C++互相调用.本文对该机制进行快速入门, 并记录了我在整个过程中遇到的问题及解决方法。 Java调用C++代码 Java调用C++代码本质上是对C++生成的动态库进行调用而不是直接对C/C++代码进行调用。 第一步:设计Java端接口; public
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
NDK 入门(三)—— JNI 注册与 JNI 线程
在 Native 方法中把 JNIEnv 和 jobject 封装在 MyContext 中,然后把 MyContext 传入 pthread_create() 的第四个参数,在 线程的入口方法 task 中接收 MyContext 使用两个封装的参数回调上层方法。默认的注册方式就是静态注册,上面提到的模板方法 stringFromJNI() 就是通过静态注册生成的 JNI 函数 Java_com_jni_register_MainActivity_stringFromJNI()。
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
Android JNI 基础入门指南
Android JNI 基础入门指南
JNI开发入门
一、概述 这篇文章用于记录JNI开发入门第一步,通过AS进行编写JNI代码,并生成so库文件。 二、NDK环境搭建 AS中下载NDK 创建一个jni项目 AS会帮我们创建两个文件 三、编写JNI代码 打开CMakeLists.txt文件,可以看到生成so库的名称和连接的cpp文件等。 # For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/
JNI入门案例
JNI 入门案例
NDK 入门(一)—— JNI 初探
宏是预处理器的一个重要概念,它是一种简单的文本替换机制。宏定义使用#define关键字,将一个标识符与一个文本片段关联起来。当源代码中出现宏标识符时,预处理器会将其替换为与之关联的文本片段。以下是一些常见的宏使用示例:// 定义 PI 为常量#define PI3.14159// 定义 PI 为常量 # define PI 3.14159 // 定义 MAX(a, b) 为宏函数 # define MAX(a , b)((a) >(b)?(a) :(b))
JNI 入门资料
看java虚拟机方面的书籍。。顺带看了下JNI ,发现几篇不错的JNI的入门文章~~~~~ http://www.iteye.com/topic/304594 http://www.iteye.com/topic/295776
android jni编程实例,android 实现 JNI NDK 入门例子教程+源码
一、背景写一个NDK入门教程,方便以后自己忘记了可以再来二、开发工具以及开发环境1、android studio2、JDK 83、LLDB4、NDK-Build支持技术分享,转载或复制,请指出文章来源 此博客作者为Jack__0023三、开始 (一共9个介绍和操作,文字大多是解释,你也可以直接看图片)1、首先创建一个Android Demo项目(我用Face作为一个Demo项目来演示)2、如果项目...
Android JNI/NDK 入门从一到二
本文基于最基础的创建JNI接口之上,来进一步入门JNI/NDK
Android NDK Samples入门指南:JNI基础与Hello-JNI详解
Android NDK Samples入门指南:JNI基础与Hello-JNI详解 【免费下载链接】ndk-samples 项目地址: https://gitcode.com/gh_mirrors/ndks/ndk-sample...
Android Studio jni开发入门——看我就够了!
1 此贴记录一下Android Studio 进行jni开发的基础配置以及入门教程,想当初使用eclipse配置ndk环境都难,现在基本都向AS转型,特此给需要帮助的新手村的同学们少走弯路☺ 一、环境配置 主要需要配置的就是NDK(Native Development Kit),现在Android studio很便利,可以一键下载: file → setting →
Android Studio jni开发之经典入门demo
此文记录一下Android Studio 进行jni开发的基础配置以及入门教程,每次都参考网上的,自己记录一下,以后就省事儿了。 一、环境配置 主要需要配置的就是NDK(Native Development Kit),可以一键下载: File → Setting → 按截图找到如下路径 → 选择NDK → 确定下载安装完成以后就可以开始coding了. 二、新建一个项目新建一个项目testJni1
2626



被折叠的 条评论
为什么被折叠?



