在idea2018和vs2017平臺下JNI編程調用C++算法(2)-調用嵌套dll實踐
阿新 • • 發佈:2018-10-13
call 簡單的 所有 實踐 路徑 因此 imp 接口 nic
背景
我之所以采用JNI是由於我要實現一個java系統,java系統需調用C++核心程序。而目前的需求是不想破壞C++核心程序的獨立性。因此想把JNI調用的接口寫在C++核心程序之外。這就需要
- 首先將C++核心程序生成內層dll
- 在外層包裝一層JNI接口調用內層dll
- 再將外層C++生成外層dll後,java調用外層dll.
那麽JNI支持這種嵌套dll調用嗎?經驗告訴我肯定能,但是程序員從來不敢想當然,那就讓我們試一試,順便理清思路吧。
上篇文章介紹了在idea2018和vs2017兩大平臺下,搭建一整套JNI程序,調用C++的過程。那麽,這篇文章就介紹一下調用嵌套dll的步驟。
主要步驟
編寫內層C++方法,生成內層dll
- 首先在vs2017中創建一個Windows桌面向導,指定應用程序類型為動態鏈接庫(具體步驟見上篇文檔),我為這個項目起名叫coreDemo。註意在這個項目中的項目屬性要按照之前的步驟添加好包含路徑等。
在項目中新建一個core.cpp,裏面實現一個簡單的兩數相加並返回結果。
#include "core.h" int add(int x, int y) { return x + y; }
將coreDemo生成dll
編寫外層C++方法(JNI格式)
- 先生成頭文件.h
在java中新建一個類,編寫native方法。
public class NestJavaDemo { public static native int add(int x, int y); }
- 使用External Tools生成頭文件
返回到vs2017,關閉coreDemo項目,新建/打開外層C++項目。在本文中,為jniCppDemo,在源文件中新建了NestCppDemo.cpp,在其中調用coreDemo.dll。需要include剛剛生成的頭文件,以及內層項目的頭文件core.h。
#include "com_study_jni_demo_nest_NestJavaDemo.h" #include "core.h" JNIEXPORT jint JNICALL Java_com_study_jni_demo_nest_NestJavaDemo_add (JNIEnv *env, jclass clz, jint x, jint y) { //調用coreDemo.dll int result = add(x, y); return (jint)result; }
外層調用內層的項目配置
寫好cpp後,還需要對項目的配置進行修改,讓外層項目能調用coreDemo.dll。
- 修改包含路徑,在包含路徑中添加coreDemo.h所在路徑。
- 修改庫路徑,在庫路徑中添加coreDemo.dll所在路徑。
外層生成dll
右側點擊生成/重新生成/生成解決方案,生成dll。
Java端運行結果
繼續編寫NestJavaDemo
package com.study.jni.demo.nest;
import com.study.jni.demo.common.Constants;
public class NestJavaDemo {
public static native int add(int x, int y);
public static void main(String[] args) {
int x = 1;
int y = 2;
int result = add(x, y);
System.out.println("result is " + result);
}
static {
// System.loadLibrary("JNICPPDEMO");
System.load(Constants.DLLPATH + "COREDEMO.dll");
System.load(Constants.DLLPATH + "JNICPPDEMO.dll");
}
}
Tips:
需要註意,在java中同樣需要將coreDemo.dll加載進來。
總結
JNI可以調用嵌套的dll,需要把所有涉及到的dll加載到Java程序中。
在idea2018和vs2017平臺下JNI編程調用C++算法(2)-調用嵌套dll實踐