`
cherryQQ
  • 浏览: 1126118 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Java Jni调用并编写dll详细教程

阅读更多

Java Jni调用并编写dll详细教程

 

JNA虽然可以直接调用Windows标准DLL,但是不支持64位DLL,如今使用64位JDK的机器越来越多,JNA反而成了鸡肋。
 

使用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测试类

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 47.6 KB
  • 大小: 98 KB
  • 大小: 57 KB
分享到:
评论

相关推荐

    Java通过JNI调用DLL动态库

    Java通过JNI调用DLL动态库,亲测试编写

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦...使用 JNA ,不需要再编写适配用的 .dll/.so ,只需要在 Java 中编写一个接口和一些代码,作为 .dll/.so 的代理,就可以在 Java 程序中调用 dll/so 。

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI实现的DEMO Java调用VC编写的DLL,对应于Linux .SO

    JNI实现的DEMO Java调用VC6编写的DLL,对应于Linux .SO 包含C的项目和Java的Eclipse项目

    PB12.5调用java8 pbjni.dll

    基于PBNI和JNI的PB调用JAVA代码方案,导入项目后得到cjavavm类,支持加载JVM、在PB中创建Java对象的代理对象

    利用JNI实现Java调用C++库

    利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。...详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)

    JNI学习示例代码,含java代码工程和win32 dll工程

    JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI...

    NetBetBeans 编写Java调用DLL代码

    NetBetBeans 编写Java调用DLL代码

    java调用C++编写的动态库dll

    此附件包含了java代码以及vs2013编写的动态库工程。

    JNI调用C语言代码示例

    使用java调用c语言编写的so/dll/sl文件。使用java调用c语言编写的so/dll/sl文件。详细介绍: http://blog.csdn.net/liu251/archive/2009/03/03/3953906.aspx 如果有疑问,可以给我留言。

    JNI技术手册 c/c++调用java

    2、 JAVA调用DLL 41 1) 将hello.dll拷贝到Java工程JavaHello下。 41 2) 运行Hello.java,则可以看到输出结果: 41 1) 将Hello.c改为Hello.cpp 41 2) 将makefile内容改为: 41 3) 其他的几乎都不用改变也可以。 42 ...

    java调用动态链接库dll

    Java™ Native Interface (JNI)就是Java 调用原生函数的机制。 事实上,很多Java 核心代码内部就是使用JNI 实现的。这些Java 功能实际上是通过原 生函数提供的。 但是,使用JNI 对Java 开发者来说简直是一场噩梦。 ...

    java-call-lazarus-dll.zip_Lazarus jni_jni.pas_lazarus_lazarus JN

    用lazarus + jni_pas 编写的 Dll 文件 可以被java 语言调用。

    JNI 调用(包含复杂对象传参)

    实现了jni 中java向vc dll传递list参数/String参数 对象的接口。vc代码可用vc6.0运行编译,java调用接口在src\common\CameraUtil.java里面。测试了好久才实现的(涉及到项目机密,部分资源文件没有上传,内部方法是...

    jna-call-dll-and-C-call-java.zip_java dll_java dll 回调_jna_jna调用d

    jna调用dll省去烦人的JNI编写,并且实现了自定义接口事件,实现C回调java

    JNI调用大全

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息......Chap 4:用javah产生一个...Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55

    Java做的锁屏软件【附源码】

    1.jni调用c编写的dll,将所有键盘操作屏蔽,但是这个dll是在32位系统编译的,64位上运行会报错。 2.双击之后输入密码,回车就锁屏了。 3.锁屏是截取的屏幕做了个图片,在输入框内输入密码回车就解密了。 4.xp下屏蔽...

    JNI完全技术手册 带完整书签

    Chap12:基本JNI调用技术(c/c++与java互调) 93 Chap13:JNI的c代码中,另外一个线程获取 JNIEnv. 96 chap 14:当JNI遇到多线程--java对象如何被C++中的多个线程访问?. 97 chap 15:JNI在多线程中的应用... 101 ...

    JNI的使用实例与讲解(初学必备)

    java调用VC++编写的动态链接库dll,文档中写了三个例子,①简单的入门小例子 ②java传整型数给dll,返回整型数,③java传两个整型数,返回整型数组,每个例子都有详细的说明,帮助初学者理解JNI的使用流程和原理!...

Global site tag (gtag.js) - Google Analytics