一、 生成C的头文件
1. 编辑Main.java
public class Main
{
public native static int getStrNum(byte str[], int strLen);
}
2. 生成头文件
按win + r打开“运行”窗口,输入“cmd”,打开DOS控制台窗口。进入上面Main.java所在的目录中,输入:
javac Main.java
javah Main
两条命令完成后会生成Main.h文件
二、 生成DLL
1. 新建空工程
在VS中新建工程:Win32 Console Application,取名“MakeDLL”,选择空工程。新建后修改工程属性:
(1) General中,将“Configuration Type”改为“Dynamic Library (.dll)”;
(2) C/C++的General中,将“Additional Include Directories”添加两项:
“C:Program FilesJavajdk1.5.0_06include”
“C:Program FilesJavajdk1.5.0_06includewin32”
根据你安装的JAVA路径而设置,这是因为在C/C++编译过程中要使用JAVA的jni.h等文件
2. 将上面生成的Main.h添加入工程
3. 新建一个新的文件main.cpp,代码如下:
#include ’Main.h’
#include ’string.h’
JNIEXPORT jint JNICALL Java_Main_getStrNum(JNIEnv *env, jclass cls, jbyteArray str, jint strLen)
{
jbyte *buffer = (*env).GetByteArrayElements(str, 0);
buffer[strLen] = ’’; // 由于JAVA自动分配空间,需要传进来字符串长度参数
jint len = strlen((char*)buffer);
return len;
}
4. 按F7编译链接,生成MakeDLL.dll文件
三、 JAVA调用DLL
在JAVA中使用上面生成的DLL文件:
1. 将MakeDLL.dll复制到与使用DLL的JAVA文件相同的目录下。
2. JAVA文件的源代码:
public class Main
{
static
{
System.loadLibrary(’MakeDLL’);
}
public native static int getStrNum(byte str[], int strLen);
public static void main(String[] args)
{
Main instance = new Main();
String str = new String(’haha’);
int num = instance.getStrNum(str.getBytes(), str.length());
System.out.println(num);
}
}
总结:
另外,JAVA与DLL函数的参数传递过程,考试,大提示像int类型的,可以直接从JNI函数参数列表中获取;而数组元素则要通过JNIEnv来获取:
jbyte *buffer = (*env).GetByteArrayElements(str, 0); // str是参数列表中jbyteArray变量
同理可以获取char[]的元素。
函数返回时,可以直接用return语句返回。也可以设置参数列表中的变量指针来返回:
(*env).SetByteArrayRegion(byteArray, 0, 128, byteArr);
byteArray是参数列表中的jbyteArray变量,作为指针用来返回需要返回的信息;byteArr是jbyte*类型,里面存放的值是要返回的内容。
其它的信息可以从Google或Baidu中通过查找“jni”或“java调用DLL”来查阅到。
本文转自
http://www.examda.com/ncre2/JAVA/fudao/20081204/085424628.html
分享到:
相关推荐
通过以上步骤,我们可以看到,JNI允许Java和C/C++代码无缝集成,实现了跨语言的混合编程。这不仅扩展了Java的功能,还能利用现有的C/C++库,提升程序性能。在实际项目中,我们应当注意内存管理、错误处理和平台兼容...
在Java程序中,通过`System.loadLibrary`加载生成的DLL,然后就可以调用C/C++实现的本地方法了。 7. **注意事项** - DLL的路径:确保Java能够找到DLL文件,可能需要设置系统路径或者将DLL放在Java的类路径下。 -...
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接
在C#开发软件的过程中,要经常调用C/C++生成的dll,本文主要介绍用C/C++生成dll的步骤,以及用C/C++、C#两种语言实现dll的引用实现。本文使用的IDE是VS2019,文章通过具体实例进行讲解,大家可以跟着自己动手进行...
标题"JAVA调用C++/C#的DLL"涉及到的技术点主要集中在Java Native Interface(JNI)上,这是一种允许Java代码与其他编程语言(如C++或C#)进行交互的标准机制。下面我们将深入探讨这一主题。 首先,JNI是Java平台的...
最后,运行Java或C#应用程序,它们将通过SWIG生成的接口调用C++ DLL中的函数。 总结一下,本教程主要介绍了如何使用SWIG在Java和C#中调用C++编写的DLL,涉及到的知识点包括:SWIG工具的使用,C++ DLL的创建,接口...
在Java中调用C++生成的DLL,我们首先需要编写C++的源代码,然后编译成动态库(即DLL文件)。 1. **C++源码编写**:创建一个C++源文件(如`native_function.cpp`),定义对外接口函数,这些函数会被Java代码通过JNI...
Java调用C++ DLL文件是跨语言编程中的一个重要应用场景,特别是在既有Java代码库又有C++动态链接库的情况下。本文将详细讲解如何在Java程序中调用C++编写的DLL文件,以及一个可用的示例。 首先,理解Java与C++交互...
Java调用C++编写的DLL动态链接库是跨语言交互的一种常见方式,主要利用了Java的JNI(Java Native Interface)技术。JNI允许Java代码与其他编程语言进行原生代码交互,包括C、C++等。本实例将详细讲解如何在Java项目...
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...
C#与C++混合编程涉及到将两种不同类型的代码(托管代码与本地代码)进行交互式调用,这是一个在软件开发中常见的需求。C#(发音为“看井”)是一种由微软开发的高级编程语言,它是一种面向对象、类型安全的编程语言...
本示例探讨的主题是如何在Java程序中调用C++编写的动态链接库(DLL)功能。这个过程通常称为JNI(Java Native Interface),它是Java平台标准版的一部分,允许Java代码和其他语言写的代码进行交互。 Java调用C++ ...
在提供的文件列表中,我们看到几个示例项目,如`AdR.Samples.CLRCallingNative`和`AdR.Samples.NativeCallingCLR`,这些示例可能是用来演示如何从C#调用C++代码,反之亦然。通过这些示例,开发者可以学习如何在实际...
本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...
在这个"JNI DEMO"中,我们将探讨如何使用JNI来调用C/C++编译生成的DLL(动态链接库)文件。 首先,我们需要了解JNI的基本工作原理。JNI为Java程序提供了一种机制,使得Java代码可以声明native方法,这些方法在Java...
2. **定义C++导出**:由于C#不能直接调用C++类,所以C++类需要暴露为C风格的函数接口,这通常通过`extern "C"`和`__declspec(dllexport)`关键字实现。 3. **P/Invoke声明**:在C#中,你需要使用`DllImport`特性来...
在本场景中,我们关注的是C++和Java的混合编程,这是一个常见的需求,尤其是在需要利用C++的高性能特性和Java的跨平台优势时。本文将深入探讨C++和Java混合编程的关键知识点,包括互操作性、接口设计、编译配置以及...
在MATLAB中,为了提升程序执行效率,常常需要利用C或C++的高效计算能力,这就是MATLAB与C/C++混合编程的核心。本篇将详细解释如何在MATLAB中调用C程序,以及如何构建MEX函数。 首先,MATLAB本身并不包含C语言的...
JAVA 调用 C/C++ 库文件(DLL)是 Java 语言与 C/C++ 语言之间的交互方式之一。在 Java 中,存在多种调用 C/C++ 库文件的方式,包括 JNI、JNative、Jawin 和 Jacob 等。其中,JNI(Java Native Interface)是 Java ...