java使用JNI调用C++程序

  • 前言
  • 开发工具
  • 编写java代码
  • 使用java类生成c++的头文件
  • 编写C++代码
  • 新建1个C++项目
  • 拷贝头文件
  • 添加头文件
  • 开发C++代码
  • 配置C++工程
  • 生成dll文件
  • 把dll文件拷贝到java项目中
  • 把dll添加到java的library中
  • 运行java程序JNIDemo


前言

日常使用java开发,有时会碰到java难以解决的问题,最近做G711音频转码时,由于java缺少音视频编码相应类库,而c++在这方面就有非常完善的类库,那就需要java通过JNI调用c++的代码。这里抽出来1个简单实例,来说明使用jni的基本方法。

开发工具

java 使用 IDEA 2017
C++ 使用 Microsoft Visual Studio Professional 2019

编写java代码

新建1个java项目jni,项目结构如下:

java代码转delphi java代码转c++代码工具_java代码转delphi


编写测试代码:

package com.chen.test;

public class JNIDemo {

    public native void testHelloWorld();

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

使用java类生成c++的头文件

java程序包的目录src执行 javah命令

E:\idea-space\MyProject\jni\src>javah -classpath . -jni com.chen.test.JNIDemo

会生成1个.c的头文件

java代码转delphi java代码转c++代码工具_c++_02

编写C++代码

新建1个C++项目

  1. 文件 -> 新建 -> 项目
  2. java代码转delphi java代码转c++代码工具_java_03

  3. 选择动态链接库(DLL),下一步
  4. java代码转delphi java代码转c++代码工具_jni_04

  5. 配置新项目名为helloJNI,点创建
  6. java代码转delphi java代码转c++代码工具_c++_05

拷贝头文件

jdk安装目录下的:include下的jni.h、 include/win32下的jni_md.h,java生成的头文件com_chen_test_JNIDemo.h拷贝到C++项目空间中

java代码转delphi java代码转c++代码工具_java代码转delphi_06

java代码转delphi java代码转c++代码工具_c++_07

添加头文件

右键头文件 --> 添加 --> 现有项

java代码转delphi java代码转c++代码工具_jni_08


选中以下3个文件添加

java代码转delphi java代码转c++代码工具_jni_09


修改com_chen_test_JNIDemo.h,把#include <jni.h>改成#include "jni.h"

开发C++代码

源文件 --> 添加 --> 类

java代码转delphi java代码转c++代码工具_java代码转delphi_10


输入类名helloJNI

java代码转delphi java代码转c++代码工具_java_11

#include "pch.h"
#include "helloJNI.h"
#include "com_chen_test_JNIDemo.h"
#include <iostream>
#include <stdio.h>

JNIEXPORT void JNICALL Java_com_chen_test_JNIDemo_testHelloWorld
(JNIEnv*, jobject) {
    printf("this is C++ !");
}

配置C++工程

右键 解决方案 --> 属性,配置为release,x64

java代码转delphi java代码转c++代码工具_头文件_12

生成dll文件

在工程名上右键,生成

java代码转delphi java代码转c++代码工具_java_13

1>正在生成代码
 1>Previous IPDB not found, fall back to full compilation.
 1>All 5 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
 1>已完成代码的生成
 1>helloJNI.vcxproj -> C:\Users\c2954\source\repos\helloJNI\x64\Release\helloJNI.dll
 ========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

在工程目录下就会生成dll文件

java代码转delphi java代码转c++代码工具_java_14

把dll文件拷贝到java项目中

java代码转delphi java代码转c++代码工具_jni_15

把dll添加到java的library中

File --> Project Structure… --> java项目 --> Dependencies --> 点 --> JARs or Directories --> 选择 helloJNI.dll

java代码转delphi java代码转c++代码工具_java_16

运行java程序JNIDemo

java代码转delphi java代码转c++代码工具_c++_17


至此,java调用c++代码示例完成。