在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程序中。

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

时间: 2024-08-07 14:13:03

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

IntelliJ IDEA平台下JNI编程(五)—本地C代码创建Java对象及引用

本文学习如何在C代码中创建Java对象和对象数组,前面我们学习了C代码中访问Java对象的属性和方法,其实在创建对象时本质上也就是调用构造函数,因此本文知识学习起来也很轻松.有了前面学习数组创建的方法后,C代码创建对象数组同样很容易,下面开始学习吧~ 1. C代码创建Java对象 创建Java对象本质就是调用构造函数,这与上一篇文章中提到的调用方法使用方法一致.下面直接贴代码: package com.huachao.java; /** * Created by HuaChao on 2017/

[转]Windows平台下Makefile学习笔记

Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码):另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便. 本文主要分为三部分:第一部分讲述namke工具使用makefile的用法:第二部分讲述makefile的主要语法:

不同平台下int类型、指针类型的数据大小

不同平台下int类型.指针类型的数据大小 对于int类型数据和指针类型数据的大小,是非常基础的问题. 在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类型的大小. 在不同的平台下,int类型和指针类型的数据类型大小时怎样的呢?如果要给出一个统一的答案,自然不可能集齐每个平台,一个个地去试,我们必须从底层进行分析. 数据总线和地址总线 计算机内的数据总线是CPU与外设进行数据交换的通路,而地址总线则是CPU用于寻址的通路. 数据总线的位数决定了CPU

MAC平台下Xcode配置使用OpenCV的具体方法 (2016最新)

1.序言: 1.1 背景 本人小白一枚,不过因为最近在从事机器视觉方面的工作,所以接触到OpenCV. 因为工作需求,本人要在MAC端使用OpenCV实现一些视觉功能,配置环境成了最大的阻碍,网上查了很多相关资料和博客,都因为版本环境问题屡试屡败,不过经历重重尝试,笔者最终还是配置成功并运行了自己的源码.当然成功的关键还是因为笔者站在了巨人的肩膀上,借鉴了很多网上的教程,为了不误导大家配置的过程,参考文章的地址统一放在文章里,望各位大大看见之后能够理解,废话不说进入正题. 1.2 环境说明 如果

win7平台下React-Native Android:Unable to upload some APKs

一.问题描述 根据网络上的Win7平台下React-native配置教程配置好开发环境的过程中,在艰难进行到react-native run-android这一步时,发现一直出现错误,截图如下: 错误的说明信息表明是 Ubable to upload some APKs.经过网上搜索最后在这里(http://www.hacksparrow.com/react-native-android-unable-to-upload-some-apks.html)得到了一个比较全面的答案,我简单地翻译一下原

【转】Android JNI编程—JNI基础

原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它们都用到了JNI编程,并且JNI编程也贯穿了Android系统,学会JNI编程对于我们学习研究Android源码.Android安全以及Android安全加固等都是有所帮助的.但是对于我们这些写Android应用的,大部分时间都是在使用Java编程,很少使用C/C++编程,对于JNI编程也了解的比较

ios及android两个平台下x264编译脚本

今年做了一些音视频编解码工作,此前做图形.图像类工作多一些,做了音视频编解码才知道,这项工作还是很有趣.很神奇的.比如采集几十M的视频数据,经过编码存储后,文件体积仅仅有几十K大小,这当中就需要x264来发挥神奇了.下面将手机端ios及android两个平台下x264编译脚本分享出来,希望对正在做相关工作的同学有帮助.x264源码地址:http://www.videolan.org/developers/x264.html 1. ios平台下x264编译.这个编译脚本修改自:https://gi

Android jni 编程入门

本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程序逻辑 我们要编写的程序包含两部分:java部分--负责界面和调用JNI native函数:JNI native 部分--负责native函数的具体实现(本文使用C语言). native 函数伪代码如下: ? 1 2 3 4 5 6 7 8 /* funtion: 传入两个整形变量,计算他们之和 r

Linux平台下Java_Android开发环境的搭建

Linux 平台下安装JDK .Eclipse .Android SDK 说明 开发工具需自行去下载,此处就不再累述 该教程安装环境为 Ubuntu 14.04 x64 其他Linux操作方式基本相同 设计文件修改部分,请先备份要修改的文件,避免操作失误导致不能还原 Liunx 平台下区分大小写,输入文件名或路径建议复制避免不必要的错误 部分操作涉及root权限,为了避免麻烦 请直接使用 root权限操作 开启root权限: 1. sudo su root 2. 后面的提示中输入用户密码 安装