⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jni_runtime.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -