打赏

java类封装成dll

@参考文章1@参考文章2@参考文章3

 

1,建立测试类,注意英文注释部分,用汉语直接编译会乱码

public class Hello {
    //native method is used for call other language procedure
    //if use chinese here then Compile would be gibberish
    public native void printHello();
    
    static{
        System.loadLibrary("HelloWorld");//加载生成的dll文件
    }
    
    public static void main(String[] args) {
        new Hello().printHello();
    }
    
}

 

 

2,编译

javac Hello.java

3,生成.h文件(.h文件为C语言的头文件,内含函数声明、宏定义、结构体定义等内容)

javah Hello

.h文件内容

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */

#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_printHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4,编写HelloWorld.c文件(.c则为C语言的源文件,内含函数实现,变量定义等内容)

#include "jni.h"
#include "Hello.h"
//#include other headers
JNIEXPORT void JNICALL Java_Hello_printHello(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}

注意,jni.h为%JAVA_HOME%\include\jni.h,Hello.h是第3步生成的,Java_Hello_printHello中的Java_Hello_不能去掉

5,下载安装mingw, 并将其安装目录配置到系统环境变量 

mingw_64位最新下载地址:mingw_64位最新版下载地址
该软件的作用是在windows系统使用gcc和g++命令,对c文件和c++文件进行编译,生成.o文件, 进而生成.dll文件。64位的只能生成64位的dll文件。若要生成32位的dll文件,请下载32位的mingw.
mingw_32最新版下载地址:mingw_32位最新版下载地址
安装完后将{minw安装目录}\mingw64\bin放到path即可。

安装成功截图:

6,成功.o文件(注意HelloWorld.c的路径和mingw/bin的关系,要保证对应能找到对方)

gcc -c -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" HelloWorld.c

7,生成.dll文件(注意事项同6)

gcc -Wl,--add-stdcall-alias -shared -o HelloWorld.dll HelloWorld.o

8,执行java命令, 验证是否成功。

java Hello

输出Hello World,成功!

 

示例项目下载:forDll.rar(内含项目、.c\.h\.o\.dll所有文件)

插件mingw64位本人百度云下载:https://pan.baidu.com/s/12XGJYTYEJp0-bORB_UfRNA

 

 

20200810:有网友反馈java10以后移除了javah命令,合并到了javac中。进入命令行输入:javac

 

 javac用法:javac <options> <source_files>

下面一大串是选项即<options>的取值

那么:javac -h 用法就应该是javac -h <directory> <source_file>

direcotry指定生成的本机标头文件的位置,随便设置个就行

sources_file就是源文件地址了,即.java文件(不需要编译成.class了)

用法示例:我在F盘新建上述Hello.java

然后执行命令即可。

javac -h ./ Hello.java

./是输出路径,C啦D啦新目录啦随便,等效于

javac -h F: Hello.java

 

posted @ 2018-10-25 10:50  每天都要学一点  阅读(10741)  评论(13编辑  收藏  举报