标签:com 调用 exp 独立 png 编写 load 注意 技术分享
我之所以采用JNI是由于我要实现一个java系统,java系统需调用C++核心程序。而目前的需求是不想破坏C++核心程序的独立性。因此想把JNI调用的接口写在C++核心程序之外。这就需要
那么JNI支持这种嵌套dll调用吗?经验告诉我肯定能,但是程序员从来不敢想当然,那就让我们试一试,顺便理清思路吧。
上篇文章介绍了在idea2018和vs2017两大平台下,搭建一整套JNI程序,调用C++的过程。那么,这篇文章就介绍一下调用嵌套dll的步骤。
在项目中新建一个core.cpp,里面实现一个简单的两数相加并返回结果。
#include "core.h"
int add(int x, int y)
{
return x + y;
}
将coreDemo生成dll
在java中新建一个类,编写native方法。
public class NestJavaDemo {
public static native int add(int x, int y);
}
返回到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。
右侧点击生成/重新生成/生成解决方案,生成dll。
继续编写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