jni 开发 调用dll 函数的流程

jni 调用dll方法以及dll内调用java方法的流程

编写java类

java 复制代码
public class abc{

    static{
        System.loadLibrary("abc.dll");
    }

    public String getResponse(String ReqStr) {
        return "ok";
    }

    public native void InitDiagObj();
    public native void CarryabcEntry(String ID);

}

将该java文件转成c++ 可用的.h文件

java 复制代码
javah -classpath D:\abc\src\main\java\ -d D:\VS_Cool\abc org.example.abc

-classpath 指定 org.example.abc 的查找路径

-d 指定生成的.h的路径

org.example.abc 指定的类

生成的文件 org_example_abc.h 内容如下

cpp 复制代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_example_Diagnosis */

#ifndef _Included_org_example_abc
#define _Included_org_example_abc
#include <string>
std::string SendDataGetResponse(std::string jsonstr);
#ifdef __cplusplus
extern "C" {
#endif

	/*
 * Class:     org_example_abc
 * Method:    InitDiagObj
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_org_example_abc_InitDiagObj
  (JNIEnv *, jobject);

/*
 * Class:     org_example_abc
 * Method:    CarryDiagnosisEntry
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_org_example_abc_CarryDiagnosisEntry
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

配置vs的dll项目

  1. 将头文件添加到dll项目中
  2. 在属性->vc++目录->包含目录->中添加 java的路径

    属性->vc++目录->引用目录->添加

    3.新建cpp 实现org_example_abc.h 的函数声明
c 复制代码
 JNIEXPORT void JNICALL Java_org_example_abc_CarryDiagnosisEntry(JNIEnv* env, jobject, jstring ID)
 {
     xxxx
 }

调用java 代码

java 复制代码
 JNIEXPORT void JNICALL Java_org_example_abc_InitDiagObj(JNIEnv*env, jobject obj)
 {
     env->GetJavaVM(&gJavaVM);//
     jclass clazz = env->GetObjectClass(obj);
     gJavaObj = env->NewGlobalRef(obj);//保存object到全局gJavaObj中 这样 可以给多线程调用
     gmdGetRes = env->GetMethodID(clazz, "getResponse",
         "(Ljava/lang/String;)Ljava/lang/String;");

 }
java 复制代码
void callGetResponse(string abc){
	jstring resp = (jstring)env->CallObjectMethod(gJavaObj, gmdGetRes, env->NewStringUTF(abc.c_str()));
	
}
相关推荐
梵得儿SHI12 分钟前
Java IO 流深度解析:对象流与序列化机制(ObjectInputStream/ObjectOutputStream)
java·开发语言·rpc·序列化·对象流·对象与字节流的转换·java对象流
百炼成神 LV@菜哥13 分钟前
记类成员变量 vs 方法中的变量
java·开发语言
せいしゅん青春之我22 分钟前
【JavaEE初阶】网络经典面试题小小结
java·网络·笔记·网络协议·tcp/ip·java-ee
Aevget23 分钟前
「Java EE开发指南」如何用MyEclipse设置Java项目依赖项属性?
java·ide·java-ee·eclipse·myeclipse
南♡黎(・ิϖ・ิ)っ27 分钟前
JavaEE初阶,文件IO(2)
java·笔记·java-ee
学习编程的Kitty27 分钟前
JavaEE初阶——多线程(4)线程安全
java·开发语言·jvm
sheji341630 分钟前
【开题答辩全过程】以 多媒体素材管理系统为例,包含答辩的问题和答案
java·eclipse
成钰33 分钟前
设计模式之抽象工厂模式:最复杂的工厂模式变种
java·设计模式·抽象工厂模式
Elieal37 分钟前
深入 Maven:从仓库配置到私服架构的进阶实践
java·架构·maven
学到头秃的suhian1 小时前
垃圾收集器
java·jvm