📄 jni_runtime.cpp
字号:
env->DeleteLocalRef (aParameter); env->DeleteLocalRef (parameterName); } env->DeleteLocalRef (jparameters); // Created lazily. _signature = 0; _methodID = 0; jclass modifierClass = env->FindClass("java/lang/reflect/Modifier"); int modifiers = callJNIMethod<jint>(aMethod, "getModifiers", "()I"); _isStatic = (bool)callJNIStaticMethod<jboolean>(modifierClass, "isStatic", "(I)Z", modifiers);}JavaMethod::~JavaMethod() { if (_signature) free(_signature); delete [] _parameters;};// JNI method signatures use '/' between components of a class name, but// we get '.' between components from the reflection API.static void appendClassName(UString& aString, const char* className){ ASSERT(JSLock::lockCount() > 0); char *result, *cp = strdup(className); result = cp; while (*cp) { if (*cp == '.') *cp = '/'; cp++; } aString.append(result); free (result);}const char *JavaMethod::signature() const { if (!_signature) { JSLock lock(false); UString signatureBuilder("("); for (int i = 0; i < _numParameters; i++) { JavaParameter* aParameter = parameterAt(i); JNIType _JNIType = aParameter->getJNIType(); if (_JNIType == array_type) appendClassName(signatureBuilder, aParameter->type()); else { signatureBuilder.append(signatureFromPrimitiveType(_JNIType)); if (_JNIType == object_type) { appendClassName(signatureBuilder, aParameter->type()); signatureBuilder.append(";"); } } } signatureBuilder.append(")"); const char *returnType = _returnType.UTF8String(); if (_JNIReturnType == array_type) { appendClassName(signatureBuilder, returnType); } else { signatureBuilder.append(signatureFromPrimitiveType(_JNIReturnType)); if (_JNIReturnType == object_type) { appendClassName(signatureBuilder, returnType); signatureBuilder.append(";"); } } _signature = strdup(signatureBuilder.ascii()); } return _signature;}JNIType JavaMethod::JNIReturnType() const{ return _JNIReturnType;}jmethodID JavaMethod::methodID (jobject obj) const{ if (_methodID == 0) { _methodID = getMethodID (obj, _name.UTF8String(), signature()); } return _methodID;}JavaArray::JavaArray(jobject array, const char* type, PassRefPtr<RootObject> rootObject) : Array(rootObject){ _array = new JObjectWrapper(array); // Java array are fixed length, so we can cache length. JNIEnv *env = getJNIEnv(); _length = env->GetArrayLength((jarray)_array->_instance); _type = strdup(type); _rootObject = rootObject;}JavaArray::~JavaArray () { free ((void *)_type);}RootObject* JavaArray::rootObject() const { return _rootObject && _rootObject->isValid() ? _rootObject.get() : 0;}void JavaArray::setValueAt(ExecState* exec, unsigned index, JSValuePtr aValue) const{ JNIEnv *env = getJNIEnv(); char *javaClassName = 0; JNIType arrayType = JNITypeFromPrimitiveType(_type[1]); if (_type[1] == 'L'){ // The type of the array will be something like: // "[Ljava.lang.string;". This is guaranteed, so no need // for extra sanity checks. javaClassName = strdup(&_type[2]); javaClassName[strchr(javaClassName, ';')-javaClassName] = 0; } jvalue aJValue = convertValueToJValue (exec, aValue, arrayType, javaClassName); switch (arrayType) { case object_type: { env->SetObjectArrayElement((jobjectArray)javaArray(), index, aJValue.l); break; } case boolean_type: { env->SetBooleanArrayRegion((jbooleanArray)javaArray(), index, 1, &aJValue.z); break; } case byte_type: { env->SetByteArrayRegion((jbyteArray)javaArray(), index, 1, &aJValue.b); break; } case char_type: { env->SetCharArrayRegion((jcharArray)javaArray(), index, 1, &aJValue.c); break; } case short_type: { env->SetShortArrayRegion((jshortArray)javaArray(), index, 1, &aJValue.s); break; } case int_type: { env->SetIntArrayRegion((jintArray)javaArray(), index, 1, &aJValue.i); break; } case long_type: { env->SetLongArrayRegion((jlongArray)javaArray(), index, 1, &aJValue.j); } case float_type: { env->SetFloatArrayRegion((jfloatArray)javaArray(), index, 1, &aJValue.f); break; } case double_type: { env->SetDoubleArrayRegion((jdoubleArray)javaArray(), index, 1, &aJValue.d); break; } default: break; } if (javaClassName) free ((void *)javaClassName);}JSValuePtr JavaArray::valueAt(ExecState* exec, unsigned index) const{ JNIEnv *env = getJNIEnv(); JNIType arrayType = JNITypeFromPrimitiveType(_type[1]); switch (arrayType) { case object_type: { jobjectArray objectArray = (jobjectArray)javaArray(); jobject anObject; anObject = env->GetObjectArrayElement(objectArray, index); // No object? if (!anObject) { return jsNull(); } // Nested array? if (_type[1] == '[') { return JavaArray::convertJObjectToArray(exec, anObject, _type+1, rootObject()); } // or array of other object type? return JavaInstance::create(anObject, rootObject())->createRuntimeObject(exec); } case boolean_type: { jbooleanArray booleanArray = (jbooleanArray)javaArray(); jboolean aBoolean; env->GetBooleanArrayRegion(booleanArray, index, 1, &aBoolean); return jsBoolean(aBoolean); } case byte_type: { jbyteArray byteArray = (jbyteArray)javaArray(); jbyte aByte; env->GetByteArrayRegion(byteArray, index, 1, &aByte); return jsNumber(exec, aByte); } case char_type: { jcharArray charArray = (jcharArray)javaArray(); jchar aChar; env->GetCharArrayRegion(charArray, index, 1, &aChar); return jsNumber(exec, aChar); break; } case short_type: { jshortArray shortArray = (jshortArray)javaArray(); jshort aShort; env->GetShortArrayRegion(shortArray, index, 1, &aShort); return jsNumber(exec, aShort); } case int_type: { jintArray intArray = (jintArray)javaArray(); jint anInt; env->GetIntArrayRegion(intArray, index, 1, &anInt); return jsNumber(exec, anInt); } case long_type: { jlongArray longArray = (jlongArray)javaArray(); jlong aLong; env->GetLongArrayRegion(longArray, index, 1, &aLong); return jsNumber(exec, aLong); } case float_type: { jfloatArray floatArray = (jfloatArray)javaArray(); jfloat aFloat; env->GetFloatArrayRegion(floatArray, index, 1, &aFloat); return jsNumber(exec, aFloat); } case double_type: { jdoubleArray doubleArray = (jdoubleArray)javaArray(); jdouble aDouble; env->GetDoubleArrayRegion(doubleArray, index, 1, &aDouble); return jsNumber(exec, aDouble); } default: break; } return jsUndefined();}unsigned int JavaArray::getLength() const{ return _length;}#endif // ENABLE(MAC_JAVA_BRIDGE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -