码迷,mamicode.com
首页 > 编程语言 > 详细

在idea2018和vs2017平台下JNI编程调用C++算法(2)-调用嵌套dll实践

时间:2018-10-13 17:23:05      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:com   调用   exp   独立   png   编写   load   注意   技术分享   

背景

我之所以采用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实践

标签:com   调用   exp   独立   png   编写   load   注意   技术分享   

原文地址:https://www.cnblogs.com/lucychen/p/9783418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!