jni 调用dll方法以及dll内调用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文件
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 内容如下
/* 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项目
- 将头文件添加到dll项目中
- 在属性->vc++目录->包含目录->中添加 java的路径
属性->vc++目录->引用目录->添加
3.新建cpp 实现org_example_abc.h 的函数声明
JNIEXPORT void JNICALL Java_org_example_abc_CarryDiagnosisEntry(JNIEnv* env, jobject, jstring ID)
{
xxxx
}
调用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;");
}
void callGetResponse(string abc){
jstring resp = (jstring)env->CallObjectMethod(gJavaObj, gmdGetRes, env->NewStringUTF(abc.c_str()));
}