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++
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
|