1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| #include "JniBridge.h"
std::string JniBridge::jstring2string(JNIEnv* env, jstring jstr) { if (jstr == nullptr) return "";
jclass clsString = env->FindClass("java/lang/String"); jstring strEncode = env->NewStringUTF("utf-8"); jmethodID mid = env->GetMethodID(clsString, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray byteArray = (jbyteArray)env->CallObjectMethod(jstr, mid, strEncode);
jsize len = env->GetArrayLength(byteArray); jbyte* bytes = env->GetByteArrayElements(byteArray, JNI_FALSE);
std::string result; if (len > 0) { char* buffer = new char[len + 1]; memcpy(buffer, bytes, len); buffer[len] = '\0'; result = std::string(buffer); delete[] buffer; }
env->ReleaseByteArrayElements(byteArray, bytes, 0); env->DeleteLocalRef(strEncode); env->DeleteLocalRef(clsString);
return result; }
jstring JniBridge::string2jstring(JNIEnv* env, const std::string& str) { return env->NewStringUTF(str.c_str()); }
std::string JniBridge::callStaticStringMethod( const char* classPath, const char* methodName, const char* signature, const std::string& param ) { JniMethodInfo minfo; std::string result = "";
if (JniHelper::getStaticMethodInfo(minfo, classPath, methodName, signature)) { jstring jParam = string2jstring(minfo.env, param); jstring jResult = (jstring)minfo.env->CallStaticObjectMethod( minfo.classID, minfo.methodID, jParam );
result = jstring2string(minfo.env, jResult);
minfo.env->DeleteLocalRef(jParam); if (jResult) minfo.env->DeleteLocalRef(jResult); minfo.env->DeleteLocalRef(minfo.classID); }
return result; }
void JniBridge::callStaticVoidMethod( const char* classPath, const char* methodName, const char* signature ) { JniMethodInfo minfo;
if (JniHelper::getStaticMethodInfo(minfo, classPath, methodName, signature)) { minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID); minfo.env->DeleteLocalRef(minfo.classID); } }
void JniBridge::callStaticVoidMethod( const char* classPath, const char* methodName, const char* signature, const std::string& param ) { JniMethodInfo minfo;
if (JniHelper::getStaticMethodInfo(minfo, classPath, methodName, signature)) { jstring jParam = string2jstring(minfo.env, param); minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, jParam); minfo.env->DeleteLocalRef(jParam); minfo.env->DeleteLocalRef(minfo.classID); } }
bool JniBridge::callStaticBoolMethod( const char* classPath, const char* methodName, const char* signature, const std::string& strParam, int intParam ) { JniMethodInfo minfo; bool result = false;
if (JniHelper::getStaticMethodInfo(minfo, classPath, methodName, signature)) { jstring jStrParam = string2jstring(minfo.env, strParam); jboolean jResult = minfo.env->CallStaticBooleanMethod( minfo.classID, minfo.methodID, jStrParam, intParam ); result = (bool)jResult; minfo.env->DeleteLocalRef(jStrParam); minfo.env->DeleteLocalRef(minfo.classID); }
return result; }
|