windows java jni调用dll


    1. 编写带有native声明的方法的java类,生成.java文件
    2. 使用javac命令编译所编写的java类,生成.class文件
    3. 使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件
    4. 使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法
    5. 将C/C++编写的文件生成动态连接库,生成dll文件

public class HelloJni {
native void hello();  
    
    static {  
        System.loadLibrary("HelloJni");  
    }  
      
    public static void main(String args[]) {  
        HelloJni helloJni = new HelloJni();  
        helloJni.hello();  
    }  

}


cmd进入到HelloJni.java文件夹,然后执行javah -jni java HelloJni命令 生成HelloJni .h头文件。

#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJni
 * Method:    hello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJni_hello
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

然后在vs2017建立一个空项目,导入头文件,同时把这个文件复制到项目所在文件夹。

执行编译,这时可能会报错,提示jni.h找不到,需要将jni.h所在的文件加入到项目的包含目录中。可以在项目中点右键->属性,然后参照下面的图添加。

windows java jni调用dll


windows java jni调用dll

然后添加一个主程序

#include "HelloJni.h"  
#include <stdio.h>  
#include <jni.h>  
/*
* Class:     HelloJni
* Method:    hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_hello
(JNIEnv * env, jobject)
{
printf("Hello Jni!\n");
return;

}

windows java jni调用dll

改成dll然后生成解决方案。

把这个文件copy到C:\Windows\System32 和java项目下就可以了。只是会报Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\System32\HelloJni.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform 应该是这只能生成32位的dll我们64位的平台无法调用。不过大概过程就是这样了。