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目录下即可

 

最后运行结果如下:

 

因为