java使用JNI調用C++程序
前言
日常使用java開發,有時會碰到java難以解決的問題,最近做G711音頻轉碼時,由於java缺少音視頻編碼相應類庫,而c++在這方面就有非常完善的類庫,那就需要java通過JNI調用c++的代碼。這裏抽出來1個簡單實例,來說明使用jni的基本方法。
開發工具
java 使用 IDEA 2017
C++ 使用 Microsoft Visual Studio Professional 2019
編寫java代碼
新建1個java項目jni,項目結構如下:
編寫測試代碼:
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的頭文件
編寫C++代碼
新建1個C++項目
-
文件 -> 新建 -> 項目
-
選擇動態鏈接庫(DLL),下一步
-
配置新項目名爲helloJNI,點創建
拷貝頭文件
jdk安裝目錄下的:include下的jni.h、 include/win32下的jni_md.h,java生成的頭文件com_chen_test_JNIDemo.h拷貝到C++項目空間中
添加頭文件
右鍵頭文件 --> 添加 --> 現有項
選中以下3個文件添加
修改com_chen_test_JNIDemo.h
,把#include <jni.h>
改成#include "jni.h"
開發C++代碼
源文件 --> 添加 --> 類
輸入類名helloJNI
#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
生成dll文件
在工程名上右鍵,生成
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文件
把dll文件拷貝到java項目中
把dll添加到java的library中
File --> Project Structure… --> java項目 --> Dependencies --> 點十 --> JARs or Directories --> 選擇 helloJNI.dll
運行java程序JNIDemo
至此,java調用c++代碼示例完成。