Java调用DLL

1、假设现在我们要用Java代码调用C语言的方法,也就是实现a+b的方法。

首先,我们需编写一个Java类,如Test.java

 1 public class Test {
 2     static {
 3         System.loadLibrary("jni");
 4     }
 5     public native int add(int a,int b);
 6     public static void main(String[] args) {
 7          Test test=new Test();
 8          int result=test.add(1, 2);
 9          System.out.println(result);
10     }
11 }

2、然后通过jdk当中的命令javac、javah依次进行编译、解析,然后就会生成一个.h的头文件Test.h:

 1 #include <jni.h>
 2 /* Header for class Test */
 3
 4 #ifndef _Included_Test
 5 #define _Included_Test
 6 #ifdef __cplusplus
 7 extern "C" {
 8 #endif
 9 /*
10  * Class:     Test
11  * Method:    add
12  * Signature: (II)I
13  */
14 JNIEXPORT jint JNICALL Java_Test_add
15   (JNIEnv *, jobject, jint, jint);
16
17 #ifdef __cplusplus
18 }
19 #endif
20 #endif

我们只关心这个方法的签名:JNIEXPORT jint JNICALL Java_Test_add (JNIEnv *, jobject, jint, jint)

3、然后打开VC++6.0,建立一个Win32 Dynamic-Link Library工程jni:

在jni.cpp文件中引入上面生成的头文件Test.h 。显然这个文件要与我们的这个工程jni要在同一个目录下,我们会很自然的想到将这个文件通过VC复制到Header Files的目录下,右击鼠标,确实看到了“添加文件到目录”的选项,但是点击这个选项后VC立马就崩溃了。我也不知道这是神马原因,只知道打开这个工程目录,下面并没有Header Files等这些目录。有一个.dsp的文件它为工程项目;.dsw的文件为工作空间,把这个Test.h的文件拷贝到与它们同级目录就行了。

我们还要在jni.cpp文件当中实现JNIEXPORT jint JNICALL Java_Test_add (JNIEnv *, jobject, jint, jint)这个方法:

 1 #include "stdafx.h"
 2 #include "HelloWorld.h"
 3
 4 BOOL APIENTRY DllMain( HANDLE hModule,
 5                        DWORD  ul_reason_for_call,
 6                        LPVOID lpReserved
 7                      )
 8 {
 9     return TRUE;
10 }
11
12 JNIEXPORT jint JNICALL Java_Test_add(JNIEnv *p, jobject obj, jint a, jint b)
13 {
14    return a+b;
15 } 

然后将这个工程组建,就会在这个工程目录下找到一个jni.dll的文件。我们将这个文件拷贝到Test.class同目录,这个Java的程序就能调用这个C编写的add方法了。

时间: 2024-10-12 18:27:38

Java调用DLL的相关文章

java调用dll或so动态库文件(c++/c)

java调用dll或so动态库文件(c++/c) 博客分类: 工作 CC#C++JavaEclipse java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.3.1.1+CDT(cdt-master-4.0.3)+MinGW(MinGW-5.1.4) 一:下面是java调用dll(C++) 1:下载并安装cdt :http://www.eclipse.org/cdt/downloads.php  :选择自己eclipse 支持的cdt插件,下载,并且 通过eclipse--

Java 调用Dll

Java 中怎么能调用到dll中的函数呢? 关键是java中生的本地函数名参数和dll中的本地函数名参数一模一样. 这个程序是java中调用dll中的求和函数. 一,java代码部分操作 1.新建工程 2.DllTest.java代码 package com.aizizai.calldll; public class DllTest { static { System.loadLibrary("hellodll"); } public static native int sum(int

Java 调用 C++ (Java 调用 dll)康哥手把手教你

因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是研究了一下Java Jni的使用方法.突然发现Android Jni 使用跟这个好像(麻蛋,不就是一样的吗,但是Android中需要使用so动态链接库). 第一步 创建Java工程,命名JniDemo,添加JniDemo.java 第二步 在Java类中添加native方法 /** * @author Baokang */ public class JniDemo{ public native static void se

在Windows中实现Java调用DLL(转载)

本文提供调用本地 C 代码的 Java 代码示例,包括传递和返回某些常用的数据类型.本地方法包含在特定于平台的可执行文件中.就本文中的示例而言,本地方法包含在 Windows 32 位动态链接库 (DLL) 中. 不过我要提醒您,对 Java 外部的调用通常不能移植到其他平台上,在 applet 中还可能引发安全异常.实现本地代码将使您的 Java 应用程序无法通过 100% 纯 Java 测试.但是,如果必须执行本地调用,则要考虑几个准则: 将您的所有本地方法都封装在单个类中,这个类调用单个

Java调用dll的实现

Java工程实现调用dll加密: 一.idea中 生成一个Java文件,加载库dll,声明native函数: static { System.loadLibrary("Test_SimpleEncryForJava"); } public native static void SimpleEncryFile(String srcFile, String desFile, String passwd); 通过命令行进入合适的目录,javah + 类名生成.h文件(不需要.java后缀).

java调用dll文件中的类型转换

char *转String   (env)->NewStringUTF("the content you want to type in"); char *转jbyteArray jbyte *by = (jbyte*)data;int nOutSize=225*9;jbyteArray jarray = env->NewByteArray(nOutSize);env->SetByteArrayRegion(jarray, 0, nOutSize, by); retu

Java通过JNI调用dll详细过程(转)

源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无需再次登录直接进入平台,CS软件方提供了一个加密解密的dll文件,我们需要在action中通过该dll解密,那么就涉及到java调用dll的问题. 首先我选择了JNI方式(因为网上说的另两种方式Jawin, Jacob更不会),大体流程如下: 1.写一个java的class,在类里声明所调用的库名称

java调用C/C++写的dll(转)

源:java调用C/C++写的dll Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C++写好的DLL库时,由于基本数据类型不同.使用字节序列可能有差异,所以在参数传递过程中容易出现问题,DLL中可能需要做相应的转换. 使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的

java调用C++ DLL库方法

最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java中新建一个类 如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了.然后我们需要dll中实现下面定义的加减乘除方法. 2.编译文件,文件名为Java2cpp.java,首先编译成class文件,如果用的是eclipse,这个