java通过jni调用native method

2023-05-16

    jdk中规定了native method,每一个native method背后对应有一个动态链接库来支持它,在windows系统上,就是dll后缀的文件。

    native method是需要通过c/c++来实现的。

    本示例所需的运行环境:

  •     jdk8
  •     vs2017

    java中调用动态链接库可以通过System.loadLibrary("Hello")来加载指定动态链接库。假定,我们可以编写这样一个java文件,定义一个hello的本地方法,然后在main函数中调用。

public class Hello{
	
	public native void hello(String name);
	
	static {
		System.loadLibrary("Hello");
	}
    public static void main(String[] args) {
		new Hello().hello("jni.");
    }
}

    可以通过javac Hello.java编译这个文件,这时候会生成Hello.class文件。接着,利用javah通过javah -jni Hello文件反向生成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:    hello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_Hello_hello
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

    接下来编写Hello.c实现Hello.h中定义的方法。

#include <jni.h>
#include "Hello.h"

#include <stdio.h>

JNIEXPORT void JNICALL Java_Hello_hello
  (JNIEnv *env, jobject obj, jstring name)
{
	printf("hello,jni.\n");
}

    可以通过命令cl编译动态链接库,生成Hello.dll,接着可以运行java Hello,打印hello,jni。如下所示:

    

    运行java程序。

    

    以上过程均在命令行下就可以运行,不需要ide编辑器,运行cl指令,需要在开始->Visual Studio 2017/适用于VS 2017的 x64本机工具命令,然后切换到java文件目录即可,这就是前面提到的运行环境需要vs2017的原因。

    通过cl命令的时候,需要指定包含jni.h所在的目录,以及包含jni_md.h所在的目录,所以使用-I(i大写)参数,表示include,因为使用了vs2017自带命令行工具,他会自动设置LIB目录环境变量,所以不用担心libcmt.lib找不到的问题。

    这个示例,其实走了一些弯路,就是使用了vc6.0++自带的cl命令编译,结果是个32位的dll文件,生成动态库没有问题,运行java程序报错:

Can't load IA 32-bit .dll on a AMD 64-bit platform

    如果你的系统是32位的,那么可以使用vc6.0++自带的cl来生成动态链接库,否则,千万不要尝试,最好直接使用vs2017自带的cl编译生成,记得切换到x64的环境上。 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java通过jni调用native method 的相关文章

随机推荐

  • 利用mocha进行以太坊智能合约编译部署测试

    使用智能合约编程语言solidity编写的智能合约 xff0c 除了可以直接通过以太坊的工具链truffle ganache cli进行测试之外 xff0c 还可以结合mocha进行单元测试 mocha单元测试本质上 xff0c 还是需要对
  • electron报错:Uncaught Error: A dynamic link library (DLL) initialization routine failed

    如题所示 xff0c 我们在进行node 43 electron开发桌面应用的时候 xff0c 经常会遇到这样的问题 xff1a 根据提示是因为ref依赖模块没有合适的编译版本 xff0c 但是我们进行npm install的时候没有报错啊
  • C语言 利用冒泡排序法对10个字符由小到大排序

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • truffle+ganache-cli构建简单以太坊智能合约并编译部署

    以前接触过以太坊工具链来做区块链练手项目 xff0c 后来荒废了 xff0c 如今再次捡起来 xff0c 算是回忆和加深 之前可能因为网络的原因 xff0c 在truffle各种初始化编译合成智能合约都遇到了好多问题 xff0c 如今再次尝
  • docker-compose搭建mongo+elasticsearch+graylog运行环境

    graylog是一个小型的开源日志收集 分析 展示框架 主要graylog运行需要mongo elasticsearch xff0c 所以他们就组成了一个小的整体 一般在虚拟机上搭建 xff0c 可以分开安装部署 xff0c 但是既然是一个
  • word文档中插入图片显示不全解决办法

    在windows下写word文档 xff0c 正常情况下 xff0c 我们应该不会遇到插入图片显示不全的问题 xff0c 好像是如果在已有的文档中插入图片 xff0c 比如文档中间插入 xff0c 图片没办法自动扩展空间 xff0c 这就导
  • quasar构建linux版本electron项目以及如何让electron程序在linux下运行

    quasar构建 xff0c 默认命令是 xff1a quasar build m electron 如果要支持linux xff0c 通常是直接加参数 target linux或者简写 T linux quasar build m ele
  • docker容器改变时区

    默认情况下的docker容器启动之后 xff0c 系统时间是UTC时间 xff0c 这导致和我们的北京时间相差8小时 xff0c 会引出很多问题 有一些容器是和项目一起构建的 xff0c 我们可以在构建的时候 xff0c 将系统时区修改为A
  • elasticsearch加入中文分词器elasticsearch-analysis-ik插件

    前言 elasticsearch作为一个分布式弹性存储与检索系统 xff0c 默认是不支持中文分词的 xff0c 但是呢 xff0c 这个工作有人做 xff0c 估计都是中国人做的吧 什么是中文分词呢 xff0c 简单来说 xff0c 就是
  • c语言自定义tcp协议实现socket通信

    一般的tcp协议示例 xff0c 大家给出的demo都是类似一个helloworld的示例 xff0c 简单罗列了socket建立 xff0c 创建连接 xff0c 发送数据 xff0c 关闭连接的过程 xff0c 实际上tcp通信确实也就
  • c语言自定义tcp协议实现socket通信(windows版本)

    前面一篇博客介绍了mac linux下通过C语言自定义协议实现socket通信的示例 xff0c 因为大部分api与windows还有很多区别 xff0c 这里就特意把windows下的tcp通信实例给介绍一下 无论是linux xff0c
  • macos升级体验

    周末在家里把macos从10 11 6版本升到了10 14 6版本 xff0c 其中的过程基本大同小异 后面想继续升级 xff0c 发现遇到了问题 网上有的说需要一步一步来升级 xff0c 如果是10 11 xff0c 需要先升级到10 1
  • xcode开发c语言开启多target

    xcode开发c语言 xff0c 在选择project template时选择command line tool xff0c 后面填入product name xff0c 最后选择存储位置就可以了 但是一般而言c语言项目只有一个main函数
  • vaex 将csv转换为hdf5

    I have a massive CSV file which I can not fit all into memory at one time How do I convert it to HDF5 We are working to
  • ubuntu1804源码编译jdk8

    这里纯粹自己弄着玩 xff0c 因为以前没有成功过 xff0c 这里记录一下 xff0c 就是让遇到问题的人可以规避问题 xff0c 快速编译自己的jdk 相信很多学java的人都看过或者了解过一本书 深入理解java虚拟机 xff0c 里
  • vmware安装minix并开启x11

    最近突然想弄一下minix这个老牌的系统 vmware安装minix3虚拟机 xff0c 其实很简单的 xff1a 1 新建虚拟机 xff0c 选择经典 2 选择客户机操作系统 xff1a 其他 xff0c 版本 xff1a 其他 64位
  • minix3通过pkgin_cd安装二进制包

    在安装完minix3虚拟机之后 xff0c 如果要进行其他工具的安装 xff0c 默认需要借助pkgin xff0c 这个需要先更新 pkgin up xff0c 然后安装各种可以被下载的包 本人试了几次之后 xff0c 发现pkgin i
  • clang: error: unable to execute command: Executable “ld“ doesn‘t exist!

    如题所示 xff0c 我在minix3中直接安装了clang xff0c 然后使用如下命令编译c程序报错 clang hello c o hello clang error unable to execute command Executa
  • c语言结构体内存对齐问题

    c语言中结构体使用是非常广泛的 xff0c 但是结构体有一个问题 xff0c 就是如果开头的字段属性是字符类型 char xff0c 紧跟着的是其他类型 xff0c 比如整型 长整型 双精度 浮点型 xff0c 这时候结构体的大小会发生改变
  • java通过jni调用native method

    jdk中规定了native method xff0c 每一个native method背后对应有一个动态链接库来支持它 xff0c 在windows系统上 xff0c 就是dll后缀的文件 native method是需要通过c c 43