java calls C++ dll
Use IDEA to create a new Java project named Java2cpp and use a template.
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
is called successfully.