jni 开发 调用dll 函数的流程

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项目

  1. 将头文件添加到dll项目中
  2. 在属性->vc++目录->包含目录->中添加 java的路径
    jdk\include\xx
    属性->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()));
	
}

使用cmake开发java调用dll或者so

在项目文件夹下创建cmakelist.txt
指定java库部分代码如下

IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
	set(CURRENT_SYSTEM Linux)
    
    #/usr/local/jdk1.8.0_381
    
    set(JAVA_JVM_LIBRARY "/usr/local/jdk1.8.0_381/jre/lib/amd64/libjvm.so")
    set(JAVA_AWT_LIBRARY "/usr/local/jdk1.8.0_381/jre/lib/amd64/libjawt.so")

    set(JAVA_INCLUDE_PATH "/usr/local/jdk1.8.0_381/include")
    set(JAVA_INCLUDE_PATH2 "/usr/local/jdk1.8.0_381/include/linux/")
    set(JAVA_AWT_INCLUDE_PATH "/usr/local/jdk1.8.0_381/include/")



    include_directories("${JAVA_INCLUDE_PATH}/")
    include_directories("${JAVA_INCLUDE_PATH}/linux/")


ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
	set(CURRENT_SYSTEM Windows)
    set(JAVA_AWT_LIBRARY "D:/jdk-8u381/lib/jawt.lib")
    set(JAVA_JVM_LIBRARY "D:/jdk-8u381/lib/jvm.lib")

    set(JAVA_INCLUDE_PATH "D:/jdk-8u381/include/")
    set(JAVA_INCLUDE_PATH2 "D:/jdk-8u381/include/win32")
    set(JAVA_AWT_INCLUDE_PATH "D:/jdk-8u381/include/")

    include_directories("${JAVA_AWT_INCLUDE_PATH}/")
    include_directories("${JAVA_AWT_INCLUDE_PATH}/win32/")
ENDIF()



find_package(JNI REQUIRED)

首先是根据环境 是Linux还是windows 去不同的路径去读取java的库
然后是设置jni为必须选项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值