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


背景

我之所以采用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程序中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM