使用JNI的步骤

简介:

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 <jni.h>
/* Header for class XXX_WitWrapper */

#ifndef _Included_XXX_witwrapper_WitWrapper
#define _Included_XXX_witwrapper_WitWrapper
#ifdef __cplusplus
extern "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 <stdlib.h>
#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了。

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

相关文章
|
Docker 容器
如何提高Docker的下载速度-----配置加速器
在正常情况下,docker默认连接的国外官方镜像,在国外的网友访问该官方镜像自然不成问题,中国的网络访问国外官方镜像网速一向很慢,而且往往还会遭遇断网的窘境。docker pull 国内网络链接失败或很卡慢,一般都需要更换至国内。
15833 1
|
SQL 运维 DataWorks
Flink CDC在阿里云DataWorks数据集成应用实践
本文整理自阿里云 DataWorks 数据集成团队的高级技术专家 王明亚(云时)老师在 Flink Forward Asia 2023 中数据集成专场的分享。
1686 2
Flink CDC在阿里云DataWorks数据集成应用实践
|
监控 应用服务中间件 nginx
使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kibana)
ELK的架构有多种,本篇分享使用的架构如图所示: Beats(Filebeat) -> -> Elasticsearch -> Kibana,目前生产环境一天几千万的日志,内存占用大概 10G
1002 4
|
12月前
|
缓存 算法 安全
探索操作系统的心脏:内核功能与性能优化####
在数字化时代,操作系统作为计算机系统的灵魂,其性能和稳定性直接影响用户体验。本文深入剖析了操作系统的核心——内核,探讨了其在资源管理、安全性和效率方面的关键作用,并提出了针对性能优化的策略,旨在为开发者和用户提供更高效、更安全的操作体验。 ####
|
算法 Java BI
Sentinel为什么这么强,我忍不住扒了扒背后的实现原理
大家好,我是三友~~ 最近我在整理代码仓库的时候突然发现了被尘封了接近两年之久的Sentinel源码库 两年前我出于好奇心扒了一下Sentinel的源码,但是由于Sentinel本身源码并不复杂,在简单扒了扒之后几乎就再没扒过了 那么既然现在又让我看到了,所以我准备再来好好地扒一扒,然后顺带写篇文章来总结一下。
Sentinel为什么这么强,我忍不住扒了扒背后的实现原理
|
存储 Java
面试高频 ThreadLocal类详解
面试高频 ThreadLocal类详解
107 0
|
NoSQL Linux C语言
Linux调试工具strace和gdb常用命令小结
strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用。 strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接收的信号,包括参数、返回值、执行时间。
1501 0
|
SQL 安全 关系型数据库
渗透测试学习笔记
旨在起到工具书及闲暇翻阅功能
1735 0
|
前端开发 开发者 Python
私有属性和方法的使用 | 学习笔记
快速学习 私有属性和方法的使用
136 0
私有属性和方法的使用 | 学习笔记