建立 dll 空工程,没有任何文件,
(这么做就可以使得编译后的到的是 dll, 而不是 exe,注意一些选项的选择)
然后吧你的 .h 文件添加到这个工程中来,
(因为 .h 是根据 java 程序用 javah 命令生成的)
再在工程中写一个 cpp 实现 .h 中的函数,
编译后即可 得到需要的 dll 了 ....
-----------------------------------------------------------
几个需要注意的地方:
1 不要使用任何其他资源,如 mfc;
2 建立的是 dll 工程, 注意是空的,即原来不能有其他文件存在
3 那个 通过 javah 获得的 .h 文件不要有任何的修改,否则可能 jni 调用时候会出错
-----------------------------------------------------------
有两个 用到的 jni 头文件从 jdk 的include 文件夹下拷贝出来就可以了,
分别是: jni.h 和 include 下的 win32\jni_md.h
拷贝到工程目录下 ....
-----------------------------------------------------------
一个例子
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
二、C/C++中所需要做的工作
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
接上例子。我们先看一下testdll.h文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具体实现的时候,我们只关心两个函数原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的 int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
好,下面我们用testdll.cpp文件具体实现这两个函数:
#include "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
- 浏览: 61798 次
- 性别:
- 来自: 北京
最新评论
-
qq506623761:
非常好!几种情况都想到了
JavaScript实现网页打印 -
yihui823:
转自:http://blog.csdn.net/yihui82 ...
项目经理问:为什么总是只有我在加班 – 挂包袱现象(转) -
lirenjuan:
...
jforum学习资源 -
playking2010:
最近准备玩玩这个,学习下
jforum学习资源 -
7454103:
...
jforum学习资源
相关推荐
Java调用VC编写的DLL(动态链接库)是跨平台编程中的常见需求,尤其是在需要利用C++或VC++实现的高性能计算或者系统级功能时。本文将深入探讨如何在Java中调用VC编译的DLL,并提供相关知识点的详细解释。 1. **JNI...
标题中的“JNI实现的DEMO Java调用VC编写的DLL,对应于Linux .SO”指的是一个使用Java Native Interface (JNI) 技术的示例,该示例展示了如何在Java程序中调用由Visual C++ (VC) 编译生成的动态链接库(DLL) 文件,...
Java调用VC++ DLL实现串口GPS的访问 本文主要介绍了如何使用Java通过JNI技术调用VC++编写的DLL来访问串口GPS。该方法可以实现Java和VC++共用的动态链接库设计,从而重用已经编写的VC++代码,避免代码浪费。 首先,...
总结,Java调用DLL的完整步骤包括:定义Java的`native`方法,使用`javah`生成头文件,编写C/C++ DLL代码,编译DLL,最后在Java程序中调用。这个过程可能需要对JNI规范有深入理解,以及一定的C/C++编程基础。通过熟练...
在本案例中,“jni.rar”是一个压缩包,包含了使用Java调用由VC(Visual C++)编译的动态链接库(DLL)接口的源代码。这种技术常用于Java应用程序需要利用本地系统功能或优化性能时,因为某些操作C/C++可能更为高效...
在本例中,“java jna 调用dll例子”指的是使用JNA在Java应用程序中调用Windows上的动态链接库(DLL)文件,这里特别提到了大华SDK的Dll,这通常用于处理视频流和视频播放功能。 大华SDK( Dahua Software ...
本文档将详细介绍如何使用Visual C++ 2010(简称VC2010)创建一个DLL文件,并在Java程序中调用这个DLL中的函数。 #### 二、环境搭建与配置 **1. 安装Visual C++ 2010** 确保您的计算机上已安装Visual C++ 2010 ...
标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...
不过这些语言的调用机制和C/C++略有不同,例如在Java中需要使用JNI(Java Native Interface)来调用本地方法,在C#中则使用P/Invoke,而Matlab则使用其自身的DLL调用方法。在调用过程中,需要注意数据类型和内存管理...
Java Native Interface (JNI) 是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在本案例中,我们讨论的是如何使用Java ...通过以上步骤,你可以成功地在Java程序中调用VC编写的DLL,并进行调试。
JAVA调用C/C++ DLL文件方法 JAVA 调用 C/C++ 库文件(DLL)是 Java 语言与 C/C++ 语言之间的交互方式之一。在 Java 中,存在多种调用 C/C++ 库文件的方式,包括 JNI、JNative、Jawin 和 Jacob 等。其中,JNI(Java ...
使用JNI可以使Java程序调用VC++中的DLL,从而实现Java程序和VC++程序之间的互相调用。 在Java中调用VC++中的DLL需要遵循以下步骤: 1. 创建Java类,用于调用VC++中的DLL。 2. 使用JNI在Java类中加载VC++中的DLL。 ...
总的来说,这个压缩包提供了Java调用C/C++ DLL的各种方法的实例,对于理解跨语言通信和本地库调用有很好的学习价值。无论是使用JNA的简洁性,还是JNative和jinvoke的灵活性,都能帮助开发者根据具体需求选择合适的...
标题"Vc 调用matlab以dll形式调用m文件"正是讨论了这个主题,通过创建DLL,我们可以将MATLAB的计算能力集成到C++应用程序中。以下是关于这个主题的详细解释: 1. **MATLAB M文件**: M文件是MATLAB的主要脚本文件...
Java调用DLL和OCX是跨语言交互的一个重要应用场景,主要涉及到Java的本地接口(Java Native Interface,JNI)和第三方库如Jacob项目。Jacob是一个Java和COM(Component Object Model)之间桥梁的开源库,它允许Java...
总结来说,这个"JNI DEMO"是一个完整的示例,展示了如何使用Java的JNI技术来调用C/C++编写的DLL。它包括了Java代码、JNI接口的实现、DLL的编译以及Java应用的运行。对于初学者,这是一个很好的实践教程,即使没有...
资源中包含java使用jna调用自己开发的twain.dll的所有源代码,自测能够实现简单扫描。 本人一直使用java 对c++程序不熟悉,现在这个twain.dll只能取得默认源,并且也弹不出来源的设置对 话框,应该是dllmain的消息...
SatJni是C++编写的动态链接库,实现了C#,PB,Delphi,VB,VC等对Java的调用,能让你很容易地调用成熟的java类库和第三方java组件。不用再为移值java代码而烦恼。 示例中演示了PB调用webservice服务(无需代理对象)得到...
开发者可以编写C/C++的动态链接库(DLL),然后在JAVA中通过JNI调用这些函数,实现对底层系统的访问或者提升性能。 2. **JNA(Java Native Access)**:JNA是另一种调用本地库的方法,比JNI更易于使用,但可能在...
当Java调用这个native方法时,实际会执行DLL中的相应函数,从而获取CPU ID。 具体步骤如下: 1. 使用VC创建DLL项目,编写C++代码,包含获取CPU ID的函数,例如: ```cpp extern "C" __declspec(dllexport) void __...