自己实现一个Native方法的调用

java开发 cad软件_java语言可以用于cad开发吗 摘要:根据COM技术原理,本文利用AutoCAD2000提供的类型库,编写了一个演示例程;同时,详细介绍了应用Java语言进行AutoCAD二次开发的方法和思路。关键字:二次开发,AutoCAD定制,COM,Java编程Microsoft的组件对象模型(COM : Component Object Model)允许基于Windows平台的应用程序之间可以建立联系并进行数据交换。采用组件对象模型有一... 阅读详情


JNI

开始本篇的内容之前,首先要讲一下JNI。Java很好,使用的人很多、应用极广,但是Java不是完美的。Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函数,即JNI实现了Java和本地代码间的双向交互。

 

Native

JDK开放给用户的源码中随处可见Native方法,被Native关键字声明的方法说明该方法不是以Java语言实现的,而是以本地语言实现的,Java可以直接拿来用。这里有一个概念,就是本地语言,本地语言这四个字,个人理解应该就是可以和操作系统直接交互的语言。

 

通过JNI调用C++写的代码

下面演示一下如何写一段简单的C++代码,在Java中用一个Native方法去调用的步骤。C++代码使用到的IDE是Microsoft Visual Studio 2010,这是一款市面上开发C++代码最常用的IDE,功能强大。OK,接下来一步一步演示一下:

1、写一段Java代码。由于我们在Windows环境下,所以用的是一个.dll文件,如果在Linux环境下的话,用的是一个.so文件。最后C++代码写完之后要生成一个.dll/.so文件,生成的文件可以使用static静态加载的方法加载进来,也可以通过配置环境变量的方式,这里选择前者。

复制代码
 1 public class TestMain
 2 {
 3     static
 4     {
 5         System.load("D:" + File.separator + "Hello.dll");
 6     }
 7     
 8     public native static void Hello();
 9     
10     public static void main(String[] args)
11     {
12         Hello();
13     }
14 }
复制代码

2、cmd进入命令行程序中,进入刚才写的那个类的CLASSPATH下,CLASSPATH就是.class文件所在的根路径。运行“JNI -jni com.xrq.test1.TestMain” ,表示为指定的类下的Native方法生成.h文件。.h文件是C/C++使用的头文件,用于将声明和实现分离,不熟悉C/C++的同学也不用深究

3、进入自己的CLASSPATH底下查看一下有没有多一个.h文件,我自己这边的是

这个命名是javah这个命令的实现帮我们命名的,只要多了这个文件就可以了

4、打开VS2010,文件-->新建-->项目,命名为“Hello”,和我们静态块中load进去的名字要一致

注意选择DLL

5、刚才通过javah生成的.h文件复制到Hello目录下

6、把这个.h添加到项目中,右键头文件-->添加-->现有项,选择Hello目录下的“com_xrq_test1_TestMain.h”添加进去就好了

7、右键源文件-->添加-->新建项,选择.cpp文件,随便命名,我叫做source.cpp。实现很简单,就打印一下“Hello”这个字符串。cout是C++的控制台输出语句,相当于Java的System.out.print(),endl是换行的意思,所以这整句相当于Java的System.out.println("Hello");

8、修改“com_xrq_test1_TestMain.h”头文件中的#include <jni.h>为#include "jni.h"

9、把%JAVA_HOME%/include目录下的“jni.h”和%JAVA_HOME%/include/win32目录下的“jni_md.h”两个文件复制到Hello目录下,用刚才添加“com_xrq_test1_TestMain.h”一样的方式添加这两个.h文件到头文件目录中,这样目录下Hello目录下应该多出了两个文件,VS2010工程目录下应该有3个.h文件。JAVA_HOME就是JDK安装目录,不知道的cmd进入命令行,echo %JAVA_HOME%就可以查看了。这一步很重要,没有这一步,C++程序是无法运行的

10、右键项目-->生成,就可以生成.dll文件了

11、刚才生成的.dll文件是32系统下的,32系统的用户可以直接使用这个.dll文件了,只要复制到静态代码块指定的目录下就好了。换句话说,64位系统的用户是不能使用这个.dll文件的。如果要生成64位计算机可以使用的.dll文件,还要额外再为64位计算机成生一个.dll文件

下拉菜单里面没有x64的点击下拉菜单-->配置管理器配置一下,自己摸索一下就好了,VS2010有自带x64的

12、生成64位的.dll,复制到D盘下即可,也就是静态代码块里面指定的Hello.dll的路径


13、运行一下第一步里面写的Java程序,C++打印的“Hello”就出来了,至此,Java通过JNI调用C++编写的代码的功能完成。

 

有什么心得?

自己完成了这么一个过程,肯定是颇有成就感的,成就感过后,我们可以从这13个步骤中感悟到什么?至少个人有以下心得:

1、1个类中有很多Native方法-->这个类中的所有Native方法生成到1个.h文件中-->本地代码生成一个.dll/.so文件和一个类的Native方法实现相对应

2、为什么有Native方法的类中必有这么一段代码

1 private static native void ();
2 static {
3         registerNatives();
4     }

现在想来,估计和我们的静态代码块起的作用一样,都是为这个类导入特定的.dll/.so文件用的。至于为什么不能像我们这么写,个人猜测,是因为不同的用户磁盘上的.dll/.so文件位置不固定,和JDK安装目录相关?

3、Java不在乎Native方法是用什么语言实现的,只要一来语言能和底层打交道就好了,二来语言实现完可以提供出来.dll/.so文件。因此同一个Native方法,如果不同的Java虚拟机去调用它,那么结果可能都不同,比如Object的hashCode(),当然,运行效率也不尽然相同,因为不同的虚拟机对于不同的Native方法有自己的实现。

Mac下Java的native方法以及JNI调用C语言 1.native方法最近在读JDK NIO的源代码的时候发现了很多的native方法,这些方法都只给出了native修饰的定义,并没有给出实现体,并且也没有实现体,形式上和接口很类似。但是这些其实是特定的native方法,那么什么是native方法呢?下面给出以下示例://sun.nio.ch;包里面的IOUtil工具类下面有一些native方法 static native boolean rand 阅读详情

相关推荐

【CAD】Java使用第三方类库解析CAD文件,详细接口说明

前篇我们一起认识了CAD绘图交换文件DXF数据格式,并以java代码为例,展示如何自定义读取dxf文件中的图形元素,将其解析成java对象类,以进行二次扩展开发。但毕竟CAD的图元世界很庞大,自己建立一套完整解析类库耗时耗力,需要一个团队支持,当然你是大牛除外。所以,下文将给大家介绍多年来我觉得最好用的一个CAD第三方解析类库,其资料偏少,基本没有说明文档,本文我会将常用接口一一列出,以Demo形式向你阐述。 类库包含的所有图元 //Entity types public final st.

Wonder ZH 7373

CadLib 4.0.2023.31601 net for Windows Crack

​CadLib 4.0读取、写入和显示 C#、VB.NET 或任何其他 .NET 语言的 AutoCAD™ DWG 和 DXF 文件。下载试用版并在几分钟内启动并运行。CadLib提供完整的类型安全,全面的文档和示例解决方案。CadLib的渲染质量很高,易于集成到您自己的应用程序中。使用 GDI+、WPF 或 OpenGL 显示 DWG 和 DXF 文件。还支持转换为 XAML。​

控件与插件之大全 1860

CADLIB、WW.CAD

CADLIB、WW.CAD

自己实现的一个Native方法的调用

JNI 开始本篇的内容之前,首先要讲一下JNI。Java很好,使用的人很多、应用极广,但是Java不是完美的。Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库...

从2026-09-21开始专注于AI,以前是后端研发、大数据研发等 483

CADLIB 二次开发

通过VC方便读取DXF格式文件 能过对载入的DXF进行修改等操作

java Native 关键字详解及自己实现一个Native方法的调用

Java中Native关键字的作用 初次遇见 native是在 java.lang.Object 源码中的一个hashCode方法: public native int hashCode(); 为什么有个native呢?这是我所要学习的地方。所以下面想要总结下native。 一、认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案...

大碍桃花开 3652

基于LTspice的共模电感差模/共模插入损耗仿真指南

在电源与EMC设计领域,插入损耗是衡量滤波器件抑制噪声能力的核心指标。共模电感作为EMI滤波器中最常见的元器件之一,其差模与共模插入损耗特性直接影响整体滤波方案的合规性。然而,仅依赖规格书曲线往往难以覆盖真实应用中的阻抗条件,借助SPICE仿真工具进行电路级验证已成为工程师常用的手段。LTspice凭借其轻量、高效的交流分析能力,能够帮助设计者快速搭建共模电感等效模型,并通过调整耦合系数、寄生电容等参数,还原漏感与谐振行为。本文以Wurth Elektronik的WE 744821201型号为例,从基本测试

weixin_27252001的博客 293

java自己调用自己_自己实现一个Native方法的调用

JNI开始本篇的内容之前,首先要讲一下JNI。Java很好,使用的人很多、应用极 广,但是Java不是完美的。Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此 Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库...

weixin_39747630的博客 822

台达PLC使用RS485Modbus指令通信

台达PLC,RS485,Modbus RTU,从站梯形图,0X01,0X02,0X05,CRC校验

lilililimu的博客 1万+

3GPP协议解读_NTN系列(一)_38.811_非地面网络(NTN)的背景、应用场景和信道建模

非地面网络覆盖广,对物理攻击和自然灾害有一定的抵抗性。本文根据3GPP协议对NTN网络的背景、应用场景和信道模型进行了整理。

JCMLSY的博客 4929

cadlib不用dll怎么直接调用里面的函数_Java基础:自己实现一个Native方法的调用...

JNI开始本篇的内容之前,首先要讲一下JNI。Java很好,使用的人很多、应用极广,但是Java不是完美的。Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本...

weixin_39910824的博客 198

Android平台实现Airplay的方法及源代码

Airplay是由苹果公司推出的一项无线音视频传输技术,它允许用户将音频、视频和照片从iOS设备(如iPhone、iPad)或Mac电脑无线传输到支持Airplay的设备(如Apple TV、智能音箱等)。具体的解码和播放方式取决于你选择的库和技术。当Android设备启动AirplayService服务后,它将监听来自iOS设备的连接请求,并在建立连接后接收、解码和播放音视频数据。在AirplayService类的onStartCommand()方法中,我们需要处理Airplay的请求。

CyberLynxX的博客 1600

一个apk调用另一个apk的native方法

环境需求:一个可以开发NDK的环境、反编译与回编的工具   1、  新建一个NDK工程(基本方法步骤网上说的基本都可以),在native方法中实现一个获取随机数的方法供测试,此工程生成的apk将在后面被另一个apk调用。 遇到的问题: 在工程目录下执行: javah-classpath bin -d jni com.feitian.random.Random 的时候出现:classfile

woshasanguo的专栏 2472

Python 爬虫实战:爬取去哪儿网酒店评价,提取住宿体验关键词

本文介绍了基于去哪儿网酒店评价数据的爬取与分析方法。首先通过分析网页结构和数据加载机制,定位到评价数据的JSON接口及关键参数。然后使用Python搭建爬虫环境,实现多页评价数据的批量采集与存储,并通过反爬策略确保数据获取的稳定性。在文本分析环节,采用jieba分词和TF-IDF算法提取高频关键词,结合词云可视化展示用户关注点。分析结果显示位置、服务、卫生是核心关注维度,同时识别出好评与差评的关键驱动因素。该方法为酒店服务优化和消费者决策提供了数据支持,并可通过扩展实现更深入的情感分析和竞品对比。

2503_91057718的博客 1000

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1165

第48篇-native方法调用解释执行的Java方法

举一个native方法调用解释执行的Java方法的实例,如下: public class TestJNI { static { System.load("/media/mazhi/sourcecode/workspace/projectjava/projectjava01/src/main/java/libdiaoyong.so"); } public static int getResult() { return 2; } public static native int get(); pub

weixin_45032957的博客 544

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-差分信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的差分拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 440

android调用native简单实现

2.写native方法的实际逻辑(以加法为例)1.写一个类作为native方法调用入口。4.配置当前项目build.gradle。3.创建CMAKELists.txt。

zhangshuaizs88的博客 946

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: Java对象表示方式2:XStream实现对对象的XML化
下一篇: System.load(String filename)和System.loadLibrary(String libname)的区别
xinjing_wangtao
博客等级 码龄14年 232粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值