JNI简介

本文深入解析了Java与DLL交互的三种主要技术:JNI、Jawin与Jacob,包括它们的功能、使用方法及示例代码。详细介绍了JNI的使用流程、Jawin与Jacob的特点与用途,以及如何通过实际代码实现Java调用DLL功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        目前java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后两个都是sourceforge上的开源项目,同时也都是基于jni技术的windows系统上的一个应用库。Jacob(Java-Com Bridge)提供了java程序调用microsoft的com对象中的方法的能力。而除了com对象外,jawin(Java/Win32 integration project)还可以win32-dll动态链接库中的方法。就功能而言:jni >> jawin>jacob。

 java本地开发接口,JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。JNI开发用途:驱动开发 (wifi-hotspot) 2.3无线热点共享,Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车,opengl,ffmpeg),复用代码(文件压缩,人脸识别…)等。

JNI的使用

JNI 的使用有两种方法。第一种方法首先要在Java 层声明要调用的本地方法,需要加上关键字native,例如:private native void sayhello();在Java 层不需要实现这个方法。然后需要将Java 代码编译成字节码,需要使用jdk 提供的Java 编译器javac。

Jni程序开发示例1:
1 创建JAVA调用DLL代码

        在eclipse项目中新建一个TestHello.java,输入以下内容:
public class TestHello {
  static {
     System.loadLibrary("TestHello");
  }
  public static native void hello(String msg);
  public static void main(String[] args) {
     hello("Hello,Kimm!");
  }
}
编译生成TestHello.class文件。
2  用javah解释成C++版的头文件

在命令行下使用javah TestHello命令,生成TestHello.h头文件(就是jni代理stub的接口),内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestHello */

#ifndef _Included_TestHello
#define _Included_TestHello
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestHello
 * Method:    hello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_TestHello_hello
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif
    其中,JNIEXPORT和JNICALL 是用于导出函数的、依赖于编译器的指示符。返回类型是映射到Java类型的C/C++类型。除了Java声明中的一般参数以外,所有这些函数的参数表中都有一个指向JNIEnv和jobject 的指针。指向JNIEnv 的指针实际上是一个指向函数指针表的指针。这些函数提供各种用来在C和C++中操作Java数据的能力。jobject 参数引用当前对象。因此,如果C 或C++代码需要引用Java函数,则这个jobject 充当引用或指针,返回调用的Java 对象。函数名本身是由前缀“Java_”加全限定类名,再加下划线和方法名构成的。
3 实现C++版的动态库

在VC6中新建一个项目TestHello, 项目类型为Win32 Dynamic-Link Library。点击OK。
在弹出的窗口中选择A simple DLL project,点击Finish。
打开项目所在的文件目录,将步骤2中生成的TestHello.h文件复制到此目录。点击左边中间的FileView,切换到文件浏览模式。在Header Files上点击右键,选择Add Files to Folder…。
选择TestHello.h文件,点击OK。
打开StdAfx.h文件,再最后面添加:
#include <jni.h>
#include "TestHello.h"
打开TestHello.cpp文件,在最后面添加一段代码:
JNIEXPORT void JNICALL Java_TestHello_hello(JNIEnv * env, jclass obj, jstring jMsg)
{
    const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);   
       MessageBox( 0, strMsgPtr,"Message box from VC++ ", 0 );
       env->ReleaseStringUTFChars( jMsg, strMsgPtr);
}
在VC的菜单上选择Tools-Options…,打开选项对话框。在Directories文件夹,添加上jdk所在文件夹下的include和include\win32文件夹。
点击VC上的菜单项Build-Build All,生成TestHello.dll。
4、  将VC项目Debug文件夹中的TestHello.dll复制到TestHello.class所在的文件夹下。
5、  在命令行下输入java TestHello,弹出MessageBox对话框。调用win32 api成功。

Jni程序开发示例2:

写个MyJni.java如下:

package kg.tom;
 
public class MyJni {
    //使用JNI的关键字native
    //这个关键字决定我们那些方法能在我们的C文件中使用
    //只须声明,不必实现
     public native void display();
     public native double sum(double x,double y);
       
    //这个是到时候调用我们写好的C文件
    //现在用不上  
    static {
     System.loadLibrary("sum");
    }
      
      
    public static void main(String[] args) {
        //到时候测试用方法现在用不上
        new MyJni().display();
        System.out.println(new MyJni().sum(2.0, 3.0));
    }
}

1 执行javah

假设MyJni在kg/tom/目录下,执行javah   kg.tom.MyJni,生成头文件kg_tom_MyJni.h。
Windows下编译库
建立win32动态库工程sum,加入kg_tom_MyJni.h,引入“jni.h”跟“jni_md.h”路径。
将"test.dll"考入java源文件的目录,执行javac   kg/tom/MyJni.java,执行java  kg/tom/MyJni,即得出结果Hello World tom!!5.0。




 
电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
内容概要:本文详细介绍了IEEE论文《Predefined-Time Sensorless Admittance Tracking Control for Teleoperation Systems With Error Constraint and Personalized Compliant Performance》的复现与分析。论文提出了一种预定义时间的无传感器导纳跟踪控制方案,适用于存在模型不确定性的遥操作系统。该方案通过具有可调刚度参数的导纳结构和预定义时间观测器(PTO),结合非奇异预定义时间终端滑模流形和预定义时间性能函数,实现了快速准确的导纳轨迹跟踪,并确保误差约束。文中详细展示了系统参数定义、EMG信号处理、预定义时间观测器、预定义时间控制器、可调刚度导纳模型及主仿真系统的代码实现。此外,还增加了动态刚度调节器、改进的广义动量观测器和安全约束模块,以增强系统的鲁棒性和安全性。 适合人群:具备一定自动化控制理论基础和编程能力的研究人员、工程师,尤其是从事机器人遥操作、人机交互等领域工作的专业人士。 使用场景及目标:①理解预定义时间控制理论及其在遥操作系统中的应用;②掌握无传感器力观测技术,减少系统复杂度;③学习如何利用肌电信号实现个性化顺应性能调整;④探索如何在保证误差约束的前提下提高系统的响应速度和精度。 阅读建议:本文内容涉及较多的数学推导和技术细节,建议读者先熟悉基本的控制理论和Python编程,重点理解各个模块的功能和相互关系。同时,可以通过运行提供的代码示例,加深对理论概念的理解,并根据自身需求调整参数进行实验验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值