• 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! ");
    return;
    }

    注意,jni.h为%JAVA_HOME%includejni.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安装目录}mingw64in放到path即可。

    安装成功截图:

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

    gcc -c -I"%JAVA_HOME%include" -I"%JAVA_HOME%includewin32" 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

  • 相关阅读:
    c#中的委托和事件
    C++STL中的vector
    java中的static
    java中public private protected区别
    java中抽象类与接口
    c++中的namespace
    北京“新城卓越”黑中介租房感受
    如何删除当前正在使用的SQLLite文件?
    SVN将一台服务器上的代码迁移到另一台服务器上
    使用PowerDesigner对NAME和COMMENT互相转换
  • 原文地址:https://www.cnblogs.com/yanan7890/p/9848400.html
Copyright © 2020-2023  润新知