java calls C++ dll

java calls C++ dll

Use IDEA to create a new Java project named Java2cpp and use a template.
Insert image description here
Use the native keyword to wrap the functions in C++ you need to use

package com.log.jni;

public class Java2cpp {
    
    
    public native void LOG_LOAD_CONFIG(String address);
    public native void LOG_DEV_INFO_2(String name,int uid,String des);
    public native void LOG_DEV_WARNING_2(String name,int uid,String des);
    public native void LOG_DEV_ERROR_2(String name,int uid,String des);
    public native void display();
   
    public static void main(String[] args){
    
    
        String log="D:\\UIH\\appdata\\MicroCT\\Console\\LogConfig\\TestLog.xml";
        Java2cpp test=new Java2cpp();
        test.LOG_LOAD_CONFIG(log);
        test.LOG_DEV_INFO_2("TestLog.xml",0x9999,"ysl");
        test.LOG_DEV_WARNING_2("TestLog.xml",0x9999,"rose");
        test.LOG_DEV_ERROR_2("TestLog.xml",0x9999,"jack");
        test.display();

   }
}

Run: javac Java2cpp.java -- Generate .class file
javac -h ./ Java2cpp.java -- Generate .h file
Use vs to create a new static library project named DllLog.
Copy the .h file generated in the Java project to the DllLog file Next,
find the include file in the Java installation path and copy the jaw_md.h jni_md.h in win32 under jni.h include. Copy these three files to DllLog.
Add a .cpp file under the source file. DllLog.cpp introduces the relevant head File

#include "pch.h"
#include "com_log_jni_Java2cpp.h"
#include "InfrasUtils/McsfLogger/mcsf_logger.h"

Complete the corresponding function

char* jstringToChar(JNIEnv* env, jstring jstr) {
    
    
    char* rtn = NULL;
    jclass clsstring = env->FindClass("java/lang/String");
    jstring strencode = env->NewStringUTF("GB2312");
    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr = (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
    jsize alen = env->GetArrayLength(barr);
    jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
    if (alen > 0) {
    
    
        rtn = (char*)malloc(alen + 1);
        memcpy(rtn, ba, alen);
        rtn[alen] = 0;
    }
    env->ReleaseByteArrayElements(barr, ba, 0);
    return rtn;
}
//jstring to string
std::string jstringTostring(JNIEnv* env, jstring jstr)
{
    
    
    char* rtn = NULL;
    jclass   clsstring = env->FindClass("java/lang/String");
    jstring   strencode = env->NewStringUTF("GB2312");
    jmethodID   mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray   barr = (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
    jsize   alen = env->GetArrayLength(barr);
    jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
    if (alen > 0)
    {
    
    
        rtn = (char*)malloc(alen + 1);
        memcpy(rtn, ba, alen);
        rtn[alen] = 0;
    }
    env->ReleaseByteArrayElements(barr, ba, 0);
    std::string stemp(rtn);
    free(rtn);
    return   stemp;
}

JNIEXPORT void JNICALL Java_com_log_jni_Java2cpp_display
(JNIEnv* env, jobject obj){
    
    
	puts("***   Hello JNI *******");
}

JNIEXPORT void JNICALL Java_com_log_jni_Java2cpp_LOG_1LOAD_1CONFIG
(JNIEnv* env , jobject obj , jstring jstr) {
    
    
	//jstring to string
    string str=jstringTostring(env, jstr);
	LOG_LOAD_CONFIG(str);
   
}

JNIEXPORT void JNICALL Java_com_log_jni_Java2cpp_LOG_1DEV_1INFO_12
(JNIEnv* env, jobject obj, jstring jname, jint uid, jstring jdes) {
    
    
    jboolean isCopy;
    char* chardata = jstringToChar(env, jname);
    char* chardes = jstringToChar(env, jdes);
    std::string name = chardata;
    std::string des = chardes;
    LOG_LOAD_CONFIG("D:\\UIH\\appdata\\MicroCT\\Console\\LogConfig\\MicroConsoleStartUpLog1.xml");
    LOG_DEV_INFO_2(name,uid)<<des;
   
}
JNIEXPORT void JNICALL Java_com_log_jni_Java2cpp_LOG_1DEV_1WARNING_12
(JNIEnv* env, jobject obj, jstring jname,jint uid, jstring jdes) {
    
    
    char* chardata = jstringToChar(env, jname);
    char* chardes = jstringToChar(env, jdes);
    std::string name = chardata;
    std::string des = chardes;
    LOG_LOAD_CONFIG("D:\\UIH\\appdata\\MicroCT\\Console\\LogConfig\\MicroConsoleStartUpLog1.xml");
    LOG_DEV_WARNING_2(name, uid)<< des;
}
JNIEXPORT void JNICALL Java_com_log_jni_Java2cpp_LOG_1DEV_1ERROR_12
(JNIEnv* env , jobject obj, jstring jname, jint uid, jstring jdes) {
    
    
    char* chardata = jstringToChar(env, jname);
    char* chardes = jstringToChar(env, jdes);
    std::string name = chardata;
    std::string des = chardes;
    LOG_LOAD_CONFIG("D:\\UIH\\appdata\\MicroCT\\Console\\LogConfig\\MicroConsoleStartUpLog1.xml");
    LOG_DEV_ERROR_2(name, uid)<< des;
}

Right-click on the project file and select Properties - VC++ Directory - General - Add directory under the include directory. Add the
current folder.../DllLog to the include directory under the installation path of java
to generate a solution. Copy the generated DllLog.dll to Java2cpp\src.
Run java under the \com\ypoj\jni file. Java2cpp.java
Insert image description here
is called successfully.

Guess you like

Origin blog.csdn.net/Stars_in_rain/article/details/122836047