You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
2.0 KiB
C++

//
// Created by tunm on 2023/1/26.
//
#ifndef ZEPHYRLPR_JNI_UTILS_H
#define ZEPHYRLPR_JNI_UTILS_H
namespace hyper {
#define HYPERLPR_API(sig) Java_com_hyperai_hyperlpr3_##sig
inline jstring stringTojstring(JNIEnv *env, const char *pat) {
jclass strClass = (env)->FindClass("java/lang/String");
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = (env)->NewByteArray(strlen(pat));
(env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte *) pat);
jstring encoding = (env)->NewStringUTF("GBK");
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
inline jstring JNIString_getString(JNIEnv *env, const char *c_str) {
//C 返回 java 字符串
jclass str_cls = (env)->FindClass("java/lang/String");
jmethodID jmid = (env)->GetMethodID(str_cls, "<init>", "([BLjava/lang/String;)V");
//jstring -> jbyteArray
jbyteArray bytes = (env)->NewByteArray(strlen(c_str));
// 将Char * 赋值到 bytes
(env)->SetByteArrayRegion(bytes, 0, strlen(c_str), (jbyte *) c_str);
jstring charsetName = (env)->NewStringUTF("GB2312");
return (jstring)(env)->NewObject(str_cls, jmid, bytes, charsetName);
}
inline std::string jstring2str(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;
}
} // namespace
#endif //ZEPHYRLPR_JNI_UTILS_H