博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用JNI的步骤
阅读量:7089 次
发布时间:2019-06-28

本文共 2408 字,大约阅读时间需要 8 分钟。

1. 写Java类,其中定义了native方法

public class WitWrapper {    static {        System.loadLibrary("witengine");    }    /**     * @param args     */    public static void main(String[] args) {        new WitWrapper().run();    }    private void run() {        solve("C:\\temp\\witlib\\problem.txt");    }    public native static int solve(String filename);}

2. 在命令行下用javah生成.h文件,内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include 
/* Header for class XXX_WitWrapper */#ifndef _Included_XXX_witwrapper_WitWrapper#define _Included_XXX_witwrapper_WitWrapper#ifdef __cplusplusextern "C" {#endif/* * Class: XXX_WitWrapper * Method: solve * Signature: (Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_XXX_WitWrapper_solve (JNIEnv *, jclass, jstring);#ifdef __cplusplus}#endif#endif 

3. 复制.h文件到一个vc++6.0的dll工程里,用vs2005得到的dll会依赖msvcr80d.dll等其他dll,不建议。把$jdk_dir$/include里的jni.h和$jdk_dir$/include/win32里的jni_md.h也添加到这个工程里。

4. 按.h文件实现.c文件对应的方法,如下例,注意jstring类型要转换成char *类型,否则即使英文也会有乱码:

/****************************************************************************  * * Sample WIT API Program. * Runs implosion on the Diner problem. * ****************************************************************************/#include 
#include "wit.h"#include "jni.h"/****************************************************************************//* Main Program *//****************************************************************************/JNIEXPORT jint JNICALL Java_XXX_WitWrapper_solve (JNIEnv * env, jclass jc, jstring file){ WitRun * theWitRun; const char *str = (*env)->GetStringUTFChars(env, file, 0);//把jstring转换为char *,否则会有错 printf(str); /* Initialize WIT */ witNewRun( &theWitRun ); witInitialize ( theWitRun ); witReadData (theWitRun, str); /************************************************************************* * * Finished entering data * ************************************************************************/ witOptImplode( theWitRun ); witWriteExecSched( theWitRun, "execsched.txt", WitBSV ); witWriteShipSched( theWitRun, "shipsched.txt", WitBSV ); witDeleteRun( theWitRun ); exit (0);} /* main */

5. 编译生成.dll文件,把它和其他依赖的文件放在path环境变量包含的一个目录下,在java里就可以调用了。注意调用这个dll的java类名(包括所在包)不能改,否则会出现UnsatisfiedLinkException,如果一定要改名,只能重新生成一遍dll了。

本文转自博客园八进制的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
kubernetes1.5新特性(二):支持Photon卷插件
查看>>
Navicat 10 for MySQL 注册码
查看>>
单例模式 事例操作 最喜欢枚举类型单例模式
查看>>
记录一次linux线上服务器被黑事件
查看>>
gitlab ssh key
查看>>
克隆虚拟机导致Linux无法启动网卡的分析与解决
查看>>
[VBS]自动加域并将计算机移至指定OU
查看>>
随机数去重
查看>>
如何从mac下的photos导出照片
查看>>
Error Code:1153 Got a packet bigger than ‘max_a...
查看>>
NCRE考试感想 三级信息安全(下)
查看>>
Java记录 -81- EnumSet和EnumMap
查看>>
我的友情链接
查看>>
张鹏 轻松学习网页设计 第03讲 html段落与标题文字!
查看>>
服务器节能
查看>>
多年收集的一些稀有软件1
查看>>
Deduplication去重算法基础之可变长度数据分片
查看>>
MyBatis学习总结(5)——实现关联表查询
查看>>
Java基础学习总结(5)——多态
查看>>
Greenplum同步到Oracle脚本
查看>>