Java Jni调用并编写dll详细教程
使用JNI,需要为C\C++生成JAVA调用约定头文件,并对标准windows DLL源码进行适当修改。以下以一个简单的例子演示整个过程。
环境:win7 64位操作系统,JDK1.7 64位,vs2010(安装x64编译支持)。
一,编写native声明的类
package com.ninecmd;
public class MyClass {
static
{
System.loadLibrary("jnidll");
}
public native static void SayHello(String word);
public native static String RepeatWord(String word);
/*public static void main(String[] args)
{
SayHello("hello");
String str = RepeatWord("么么哒");
System.out.println(str);
}
*/
}
“SayHello”,“RepeatWord”为将来dll文件中的函数声明。这个类的作用是生成C\C++头文件
二,生成C\C++头文件
这里需要注意classpath的路径问题。本例中MyClass 类的完整路径为E:\src\com\ninecmd\MyClass.java,类的包名为com.ninecmd,所以classpath应设置为E:\src。
将cmd切换至E:\src。
1、编译MyClass,在同目录生成MyClass.class
E:\src>javac com\ninecmd\MyClass.java
2、生成头文件(注意classpath路径设置)
E:\src>javah -classpath E:\src -d com\ninecmd\ -jni com.ninecmd.MyClass
avah参数说明:
javah -classpath 类目录 -d 头文件输出目录 -jni 完整类名
此时在E:\src\com\ninecmd目录中生成了com_ninecmd_MyClass.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ninecmd_MyClass */
#ifndef _Included_com_ninecmd_MyClass
#define _Included_com_ninecmd_MyClass
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ninecmd_MyClass
* Method: SayHello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_ninecmd_MyClass_SayHello
(JNIEnv *, jobject, jstring);
/*
* Class: com_ninecmd_MyClass
* Method: RepeatWord
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ninecmd_MyClass_RepeatWord
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
三,编写DLL代码
1、本例编写x64 DLL,打开vs2010,创建一个MFC DLL工程。将平台改为x64
2、引入头文件,为了顺眼,我把头文件改名为MyClass.h。
3、编写与头文件声明一致的导出函数。
主要代码:
//将jstring类型转换成windows char*类型
char* jstringToChars( JNIEnv *env, jstring jstr )
{
int length = (env)->GetStringLength(jstr );
const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
char* rtn = (char*)malloc( length*2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
if( size <= 0 )
return NULL;
(env)->ReleaseStringChars(jstr, jcstr );
rtn[size] = 0;
return rtn;
}
//将windows char*类型转换成jstring类型
jstring CharsTojstring( JNIEnv* env, char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short * buffer = 0;
if( slen == 0 )
rtn = (env)->NewStringUTF(str );
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer = (unsigned short *)malloc( length*2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = (env)->NewString( (jchar*)buffer, length );
}
if( buffer )
free( buffer );
return rtn;
}
JNIEXPORT void JNICALL Java_com_ninecmd_MyClass_SayHello
(JNIEnv *env, jobject obj, jstring jstr)
{
char* str = jstringToChars(env,jstr);
CString out(str);
AfxMessageBox((out));
}
JNIEXPORT jstring JNICALL Java_com_ninecmd_MyClass_RepeatWord
(JNIEnv *env, jobject obj, jstring jstr)
{
return jstr;
}
4、编译发布dll。
四,JNI调用dll
将生成的dll,修改文件名为jnidll.dll,复制到系统System32目录下。将第一步中类代码main函数注释去掉。重新编译类(为保证中文字符串兼容,代码文件需为ANSI编码),并运行测试。
或者用eclipse测试类
相关推荐
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
JNI 将 Java 应用程序与 C++ DLL 文件集成需要以下步骤:创建一个 Java 工程,生成 `.class` 文件,使用 `javah` 命令生成 `.h` 头文件,创建一个 C++ 工程,并将生成的 `.h` 头文件复制到工程中,编写 C++ 代码,并...
Java通过JNI调用DLL动态库,亲测试编写
运行Java程序,JNI会自动加载DLL并调用对应的本地方法。例如: ```java public static void main(String[] args) { NativeDemo demo = new NativeDemo(); demo.callDllFunction(); } ``` 6. **异常处理与...
Java JNI例子-创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)
通过以上步骤,你就可以在Java应用程序中利用JNI调用IC卡读卡器的DLL,实现读取和写入IC卡的功能。注意,调用DLL可能会涉及线程安全、错误处理以及资源管理等问题,所以在实际应用中需要仔细考虑这些因素。此外,...
在本案例中,我们讨论的是如何使用Java JNI调用一个名为"AlarmTTS"的VC(Visual C++)动态链接库(DLL)并进行调试。 首先,我们需要了解Java部分的代码。`CallAlarmTTSDll`类是Java程序的核心,它定义了三个本地...
在本篇文章中,我们将详细介绍如何使用 JAVA 调用 C# 编写的 DLL 文件。首先,我们需要了解什么是 DLL 文件,以及它在编程中的应用。 DLL 文件是一种动态链接库文件,它可以被多个程序同时使用,减少了代码的重复...
例如,`java jni调用so中的函数api.txt`中可能包含了具体的JNI函数调用示例。 其次,JNA是一种更高级的接口,它提供了更简洁的方式来调用本地库,无需编写C/C++代码。JNA通过映射Java方法到本地函数,减少了编程...
Java使用JNI调用DLL来实现系统热键屏蔽与任务栏隐藏是一种跨平台编程技术的应用,主要涉及Java的本地接口(JNI)和Windows API。本文将深入解析这一技术的关键点,并提供相关的知识背景。 首先,JNI(Java Native ...
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。...对于初学者,这是一个很好的实践教程,即使没有Java背景,也能通过提供的步骤理解和实践JNI调用DLL的过程。
### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...
2. **DLL编译**:使用Delphi编写DLL代码,并确保导出需要在Java中调用的函数。 3. **Java加载DLL**:使用`System.loadLibrary`加载DLL文件,确保路径正确且文件可访问。 4. **数据类型匹配**:Java和C/C++的数据...
在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...
### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...
我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦...使用 JNA ,不需要再编写适配用的 .dll/.so ,只需要在 Java 中编写一个接口和一些代码,作为 .dll/.so 的代理,就可以在 Java 程序中调用 dll/so 。
Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...
下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,使得Java代码能够调用本地代码(如C和C++),反之亦然。JNI接口包括了各种函数,让开发者可以...
- **JNI动态库**:这是由C或C++编写的库,实现了GMSSL的原生接口,供Java通过JNI调用。库可能有多个版本,针对不同的操作系统和处理器架构。 - **Java调用示例**:这些示例代码展示了如何在Java中加载和使用JNI库,...
JNI(Java Native Interface)是Java平台提供的一种标准接口,用于在Java...通过以上步骤,你就可以成功地在Java程序中通过JNI调用C++和Delphi编写的DLL函数了。这在需要利用现有本地库或执行低级操作的场合非常有用。