Java调用C/C++语言的方法

Java的JNI的简单应用(对接C或者C++)

1.什么是JNI

JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 [1] 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境。

以上内容来至百度百科,简单来说就是java调用其它语言的一个机制。

至于为什么要用JNI,请自行Google或者百度

2.调试环境

Jdk1.8 ;Eclipse;Visual Stdio 2017;
调试环境也可以和我不一样,但是大体流程都是差不多的,自己注意一下细节就可以了

3.准备过程

1.首先在eclipse中创建HJ.java.然后声明几个native方法。
代码如下:

public class HJ {
	public native int intMethod(int n);
    public native boolean booleanMethod(boolean bool);
    public native String stringMethod(String text);
    public native int intArrayMethod(int[] intArray);
    }

以上代码用java定义了四个native方法,然后准备使用C/C++来实现这四个方法。
接下来使用java命令生成native方法的头文件:
javac HJ.java -h ./
在这里插入图片描述
头文件,在C/C++中一般是用于定义方法和函数的一个文件。在编译的时候头文件相当于被写到引用头文件的C文件的前面。
新生成的.h的内容(以下代码是执行java命令后自动生成的 ):

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

#ifndef _Included_zhp_jni_HJ
#define _Included_zhp_jni_HJ
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     zhp_jni_HJ
 * Method:    intMethod
 * Signature: (I)I
 * 简要解释:这里的jint相当于是java中的int方法的一个标记
 */
JNIEXPORT jint JNICALL Java_zhp_jni_HJ_intMethod
  (JNIEnv *, jobject, jint);

/*
 * Class:     zhp_jni_HJ
 * Method:    booleanMethod
 * Signature: (Z)Z
 */
JNIEXPORT jboolean JNICALL Java_zhp_jni_HJ_booleanMethod
  (JNIEnv *, jobject, jboolean);

/*
 * Class:     zhp_jni_HJ
 * Method:    stringMethod
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_zhp_jni_HJ_stringMethod
  (JNIEnv *, jobject, jstring);

/*
 * Class:     zhp_jni_HJ
 * Method:    intArrayMethod
 * Signature: ([I)I
 */
JNIEXPORT jint JNICALL Java_zhp_jni_HJ_intArrayMethod
  (JNIEnv *, jobject, jintArray);

#ifdef __cplusplus
}
#endif
#endif

接下来在VisualStdio中新建一个C/C++的dll项目。然后在将刚刚生成的.h头文件复制到项目的文件目录中。并将java安装目下的jdk下的include目录里面的内容添加到新加C/C++的dll项目的引用中去。在项目中新建一个.cpp文件。并include之前的.h文件。对.h文件中的方法进行实现。(这里注意一下,我用的visual stdio 2017在引入jdk目录下的include文件夹后,编辑器提示报错,然后跟踪了一下代码发现是java自带的include文件夹下的一个.h文件中的include路径有问题,这个具体视个人环境而定,如有遇到莫名其妙的报错,可以查看一下。自己手动修改一下include就可以了)
大致代码如下:

#include<string.h>
#include"zhp_jni_HJ.h"

JNIEXPORT jint JNICALL Java_zhp_jni_HJ_intMethod
(JNIEnv *env, jobject obj, jint num)
{
	return num * num;
}

JNIEXPORT jboolean JNICALL Java_zhp_jni_HJ_booleanMethod
(JNIEnv *env, jobject obj, jboolean boolean)
{
	return !boolean;
}

JNIEXPORT jstring JNICALL Java_zhp_jni_HJ_stringMethod
(JNIEnv *env, jobject obj, jstring string)
{
	return NULL;
}

JNIEXPORT jint JNICALL Java_zhp_jni_HJ_intArrayMethod
(JNIEnv *env, jobject obj, jintArray array)
{
	int i, sum = 0;
	return sum;
}

这里因为是学习测试的代码所以比较简单,更复杂的逻辑顺着这个思路来应该能解决。
最后编译生成dll文件,移到java能读到的目录(这里的目录是“java.library.path”目录)。可以用
System.getProperty("java.library.path")自己的这个属性的目录有哪些,然后把生成好的dll移动到其中一个目录下即可。
最后使用:System.loadLibrary("your_dll_name")加载后即可调用相应的方法。

4.运行结果

在这里插入图片描述
本人才疏学浅,如有错误,欢迎指正,谢谢!
(转载请注明来源)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值