JAVA 与C++ 混合编程 Java中调用C/C++生成的DLL(转) 今天药忘吃喽~ 2022-05-12 15:56 426阅读 0赞 ### JAVA 与C++ 混合编程 Java中调用C/C++生成的DLL(转) 2011-01-24 19:36:03| 分类: [ 编程][Link 1]|字号 订阅 JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。 简单介绍及应用如下: 一、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 -classpath . testdll(不带.class),\-classpath . ---表示在当前目录找class。则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。 在写jsp时,一般都有包名,这个时候要用: ** javah -classpath . packagename.classname** 二、C/C++中所需要做的工作 **首先得准备工作很重要:** **在vc的tools/options/directory中加入jni.h和jni\_md.h两个文件所在的绝对路径,在/jdk/include和/jdk/include/win32下。** 对于已生成的.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"//这里testdll.h已经帮我们做好了生成java调用的动态链接库的准备,我们不用再去写生成动态链接库的头文件了 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的目录下,如果你的输出文件在bin目录下,那么动态链接库要放在.classpath文件所在的目录下,java testdll运行它,就可以观察到结果了。 ### [Link 1]: http://blog.163.com/ding_liang1989/blog/#m=0&t=1&c=fks_084064092082088075081083082095085080089068092094085065093
相关 Java与C++混合编程案例解析 Java和C++混合编程在实际项目中常常会出现,比如需要使用Java的面向对象特性,同时又有一些性能要求较高的部分需要用到C++。以下是一个简单的混合编程案例分析: 1. * 缺乏、安全感/ 2024年09月11日 13:30/ 0 赞/ 16 阅读
相关 Lua与C语言混合编程:Lua调用C库编程 在软件开发中,有时候需要在Lua脚本中使用C语言编写的库函数来提供更高效的计算和底层操作。Lua提供了强大的扩展能力,可以通过调用C库函数来扩展Lua的功能。本文将介绍如何使用 逃离我推掉我的手/ 2024年02月24日 03:52/ 0 赞/ 12 阅读
相关 c 调用matlab生成的dll,vs2008中调用matlab生成的dll matlab版本为:matlab7.11.0(R2010b) vs2008 1.在matlab中生成dll 在m文件中实现如下功能: 获得N个魔方矩阵的秩。m文件的内容 妖狐艹你老母/ 2023年01月15日 02:28/ 0 赞/ 128 阅读
相关 java调用C/C++生成dll程序案例 情境 最近在做平台对接工作,涉及到java调用C/C++程序,使用的是基于JNI的JNA 项目案例 ( linux环境调用so文 柔情只为你懂/ 2022年12月03日 05:13/ 0 赞/ 123 阅读
相关 c 调用java jni_【转】使用JNI进行混合编程:在C/C++中调用Java代码 原文链接:http://www.cnblogs.com/icejoywoo/archive/2012/02/24/2367116.html JNI就是Java Native 落日映苍穹つ/ 2022年11月05日 10:51/ 0 赞/ 181 阅读
相关 java调用dll实例_java调用DLL实例 创建DLL工程,网上已有例子如http://wenku.baidu.com/view/df05f80103d8ce2f0066238a.html,现在是vs2010与文章中提到 朴灿烈づ我的快乐病毒、/ 2022年11月03日 05:22/ 0 赞/ 200 阅读
相关 VC与Matlab混合编程(在VC中调用DLL) VC与Matlab混合编程(在VC中调用DLL) 标签: [ matlab][matlab][编程][Link 1][dll][][microsoft][][compile 柔光的暖阳◎/ 2022年07月16日 11:09/ 0 赞/ 215 阅读
相关 JAVA 与C++ 混合编程 Java中调用C/C++生成的DLL(转) JAVA 与C++ 混合编程 Java中调用C/C++生成的DLL(转) 2011-01-24 19:36:03| 分类: [ 编程][Link 1]|字号 订阅 今天药忘吃喽~/ 2022年05月12日 15:56/ 0 赞/ 427 阅读
相关 C++与Java混合编程 C++与Java混合编程 文章概要: 现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,现实的情况是,真实的项目中,通常是涉及多种 偏执的太偏执、/ 2022年05月12日 15:50/ 0 赞/ 167 阅读
还没有评论,来说两句吧...