/* * Class: java_lang_VMClassRegistry * Method: defineClass * Signature: (Ljava/lang/String;[BII)Ljava/lang/Class; */ JNIEXPORT jclass JNICALL Java_java_lang_ClassLoader_defineClass0 (JNIEnv *jenv, jobject cl, jstring name, jbyteArray data, jint offset, jint len) { const char* clssname = NULL; // obtain char * for the name if provided if(name) { clssname = GetStringUTFChars(jenv, name, NULL); } // obtain raw classfile data data pointer jboolean is_copy; jbyte *bytes = GetByteArrayElements(jenv, data, &is_copy); assert(bytes); // define class jclass clss = DefineClass(jenv, clssname, cl, bytes + offset, len); // release JNI objects ReleaseByteArrayElements(jenv, data, bytes, 0); if(clssname) ReleaseStringUTFChars(jenv, name, clssname); return clss; }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ std::string CreateSTDStringFromJByteArray(jbyteArray in_array, u32 in_length) { if (in_array == nullptr || in_length == 0) { return ""; } auto environment = JavaVirtualMachine::Get()->GetJNIEnvironment(); jbyte* bytes = environment->GetByteArrayElements(in_array, JNI_FALSE); CS_ASSERT(bytes != nullptr, "Bytes returned by GetByteArrayElements() cannot be null."); std::string strOutput((const char*)bytes, in_length); environment->ReleaseByteArrayElements(in_array, bytes, 0); return strOutput; }
static void callJNIReturnString(const char* str, char* result) { auto env = gApp->activity->env; auto vm = gApp->activity->vm; auto obj = gApp->activity->clazz; vm->AttachCurrentThread( &env, NULL ); auto clazz = env->GetObjectClass(obj); jmethodID methodID = env->GetMethodID(clazz, str, "()[B"); auto array = (jbyteArray)env->CallObjectMethod(obj, methodID); auto ptr = env->GetByteArrayElements(array, 0); int len = env->GetArrayLength(array); memcpy(result, ptr, len); result[len] = '\0'; env->ReleaseByteArrayElements(array, ptr, JNI_ABORT); vm->DetachCurrentThread(); }