1. 程式人生 > >在idea2018和vs2017平臺下JNI編程調用C++算法(2)-調用嵌套dll實踐

在idea2018和vs2017平臺下JNI編程調用C++算法(2)-調用嵌套dll實踐

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

  1. 首先在vs2017中創建一個Windows桌面向導,指定應用程序類型為動態鏈接庫(具體步驟見上篇文檔),我為這個項目起名叫coreDemo。註意在這個項目中的項目屬性要按照之前的步驟添加好包含路徑等。
  2. 在項目中新建一個core.cpp,裏面實現一個簡單的兩數相加並返回結果。

     #include "core.h"
    
     int add(int x, int y)
     {
         return x + y;
     }
  3. 將coreDemo生成dll

編寫外層C++方法(JNI格式)

  1. 先生成頭文件.h
    1. 在java中新建一個類,編寫native方法。

       public class NestJavaDemo {  
       public static native int add(int x, int y);
       }
    2. 使用External Tools生成頭文件
  2. 返回到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。

  1. 修改包含路徑,在包含路徑中添加coreDemo.h所在路徑。
    技術分享圖片
  2. 修改庫路徑,在庫路徑中添加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實踐