java通过JNI调用c/c++文件

java可以非常顺利地通过JNI机制调用c++原生文件。使得c++文件能够被java调用。

第一步,编写java测试类

首先使用IDEA 建立项目,新建一个JNIDemo的java文件

package  com.aijiao.test;
public class JNIDemo {

    public native void testHello();

    public static void main(String[] args){
        System.loadLibrary("TestJNI");
        JNIDemo jniDemo= new JNIDemo();
        jniDemo.testHello();
    }
}

调用terminal
然后输入以下代码:(这个代码可以进一步地制定输出文件夹)
javac -h . JNIDemo.java

该代码运行后,会在当前文件夹下生成.h文件,名为com_aijiao_test_JNIDemo.h

内容如下图所示:

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

#ifndef _Included_com_aijiao_test_JNIDemo
#define _Included_com_aijiao_test_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_aijiao_test_JNIDemo
 * Method:    testHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_aijiao_test_JNIDemo_testHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

第二步,编写c代码

  • 文件,新建项目,然后如图所示:
    java通过JNI调用c/c++文件

  • 选择dll,空项目,点完成。然后会生成如下的项目结构

  • java通过JNI调用c/c++文件

在源文件的文件夹上右键,选择添加->类,输入TestJNI后,其他的会自动生成
java通过JNI调用c/c++文件

然后将刚才生成的com_aijiao_test-JNIDemo.h以及jdk安装后的 jni.h和jni_md.h(C:\Program Files\Java\jdk-11.0.1\include\win32)拷贝到projects文件夹
D:\Documents\Visual Studio 2013\Projects\TestJNI\TestJNI

java通过JNI调用c/c++文件

回到visual studio ,在头文件上右键,添加->现有项,然后选择com_aijiao_test-JNIDemo.h, jni.h和jni_md.h
java通过JNI调用c/c++文件

将com_aijiao_test-JNIDemo.h中的#include <jni.h>改为#include “jni.h”
java通过JNI调用c/c++文件

然后在源文件 TestJNI.cpp上输入下面的代码

#include"com_aijiao_test_JNIDemo.h"
#include <iostream>
#include <stdio.h>


JNIEXPORT void JNICALL Java_com_aijiao_test_JNIDemo_testHello(JNIEnv *, jobject){
	printf("c++ test:this is the beginning.");

}

3.配置c工程,生成dll库

右键 解决方案,右键 属性,
java通过JNI调用c/c++文件

然后配置:
java通过JNI调用c/c++文件

配置完后,生成dll文件
java通过JNI调用c/c++文件

显示如图信息:
java通过JNI调用c/c++文件

4.java配置并调用

在右上角 configure 中的 VM options 中 输入library调用的dll的文件夹位置

-Djava.library.path=d:\documents\visual studio 2013\Projects\TestJNI\Release

java通过JNI调用c/c++文件

在运行后出现了如下问题:
java通过JNI调用c/c++文件