vector<string> NativeScriptRuntime::GetTypeMetadata(const string& name, int index) { JEnv env; string canonicalName = Util::ConvertFromJniToCanonicalName(name); JniLocalRef className(env.NewStringUTF(canonicalName.c_str())); jint idx = index; JniLocalRef pubApi(env.CallStaticObjectMethod(PlatformClass, GET_TYPE_METADATA, (jstring) className, idx)); jsize length = env.GetArrayLength(pubApi); assert(length > 0); vector<string> result; for (jsize i=0; i<length; i++) { JniLocalRef s(env.GetObjectArrayElement(pubApi, i)); const char *pc = env.GetStringUTFChars(s, nullptr); result.push_back(string(pc)); env.ReleaseStringUTFChars(s, pc); } return result; }
int NativeScriptRuntime::GetArrayLength(const Local<Object>& arr) { JEnv env; auto javaArr = reinterpret_cast<jarray>(objectManager->GetJavaObjectByJsObject(arr)); auto length = env.GetArrayLength(javaArr); return length; }
Local<Array> ArgConverter::ConvertJavaArgsToJsArgs(jobjectArray args) { JEnv env; auto isolate = Isolate::GetCurrent(); int argc = env.GetArrayLength(args) / 3; Local<Array> arr(Array::New(isolate, argc)); int jArrayIndex = 0; for (int i = 0; i < argc; i++) { JniLocalRef argTypeIDObj(env.GetObjectArrayElement(args, jArrayIndex++)); JniLocalRef arg(env.GetObjectArrayElement(args, jArrayIndex++)); JniLocalRef argJavaClassPath(env.GetObjectArrayElement(args, jArrayIndex++)); jint length; Type argTypeID = (Type)JType::IntValue(env, argTypeIDObj); Local<Value> jsArg; switch (argTypeID) { case Type::Boolean: jsArg = Boolean::New(isolate, JType::BooleanValue(env, arg)); break; case Type::Char: jsArg =jcharToV8String(JType::CharValue(env, arg)); break; case Type::Byte: jsArg = Number::New(isolate, JType::ByteValue(env, arg)); break; case Type::Short: jsArg = Number::New(isolate, JType::ShortValue(env, arg)); break; case Type::Int: jsArg = Number::New(isolate, JType::IntValue(env, arg)); break; case Type::Long: jsArg = Number::New(isolate, JType::LongValue(env, arg)); break; case Type::Float: jsArg = Number::New(isolate, JType::FloatValue(env, arg)); break; case Type::Double: jsArg = Number::New(isolate, JType::DoubleValue(env, arg)); break; case Type::String: jsArg = jstringToV8String((jstring)arg); break; case Type::JsObject: { jint javaObjectID = JType::IntValue(env, arg); jsArg = ObjectManager::GetJsObjectByJavaObjectStatic(javaObjectID); if (jsArg.IsEmpty()) { string argClassName = jstringToString(ObjectToString(argJavaClassPath)); argClassName = Util::ConvertFromCanonicalToJniName(argClassName); jsArg = ObjectManager::CreateJSWrapperStatic(javaObjectID, argClassName); } break; } case Type::Null: jsArg = Null(isolate); break; } arr->Set(i, jsArg); } return arr; }