Java 调用c/c++程序
1.编写java程序:
package com.jiangzeyun.jni;
/**
*
* @author jiangzeyun
* jni本质上就是jva代码调用动态连接过程(在windows上,动态连接口就是一个dll文件,在linux上动态链接库so文件)
*/
public class HelloWorld {
static{
System.loadLibrary("jniTest");//,动态链接库,不要加后缀名
}
/**
* 定义一个本地方法
*/
public native void output();
public static void main(String[] args) {
HelloWorld test=new HelloWorld();
test.output();
}
}
2.编译该文件生成class文件
3.生成头文件
之后会生成一个com_jiangzeyun_jni_HelloWorld.h文件
打开这个文件(此文件最好不要去改动):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jiangzeyun_jni_HelloWorld */
#ifndef _Included_com_jiangzeyun_jni_HelloWorld
#define _Included_com_jiangzeyun_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jiangzeyun_jni_HelloWorld
* Method: output
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_jiangzeyun_jni_HelloWorld_output
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4.接下来去生成dll文件
我这里用vs2013生成dll文件步骤如下:
确定之后选择 应用程序类型为:DLL
然后完成
5.加载所需要的头文件:
①加载com_jiangzeyun_jni_HelloWorld.h
把com_jiangzeyun_jni_HelloWorld.h拷贝到
目录下
②加载jni.h和jni_md.h
找到jdk安装路径,我们会看到Java\jdk1.7.0_17\include目录下有jni.h,Java\jdk1.7.0_17\include\win32有jni_md.h
右击在vs2013中创建的项目,选择属性选项
把刚才那两个目录加进去,效果图如下:
6.一切准备就绪,现在开始编写我们的c++代码:
其中JNIEXPORT void JNICALL Java_com_jiangzeyun_jni_HelloWorld_output
(JNIEnv *, jobject){}函数是从com_jiangzeyun_jni_HelloWorld.h中拷贝
7,生成我们需要的dll
①右击项目--》生成
②在项目的Debug文件夹中找到jniTest.dll(因为我创建的项目是jniTest)
8.运行java程序调用我们所写的c++程序
①把jniTest.dll拷贝到Java\jdk1.7.0_17\bin 文件夹中
②
Java程序如下:
运行结果如下:
错误原因是我们生成的32位的dl,而本人机子是64位系统,所以需要生成64位dll
9.生成64dll步骤如下:(32位系统不需要去生成64位dll)
①
②新建64位平台
③然后重新右击项目生成dll,再把改dll复制给java的bin目录下即可
最后运行结果如下:
因为