0

次のように Objective-C に NSString がある場合、JavaScriptCore を使用します。

NSString *objcName = @"Kristof";

および jsContextRef と呼ばれる JSGlobalContextRefコンテキスト

objcName の Objective-C 値を jsContextRef の名前付き JavaScript 変数に転送するにはどうすればよいですか? 私は次のように考えていました:

JSStringRef jsNameRef = JSStringCreateWithUTF8CString([objcName UTF8String]);
JSValueRef jsValueRef = JSValueMakeString(jsContextRef, jsNameRef);

変数名が「jsName」になるとしましょう。次のような呼び出しがさらに 2 回 (または 1 回でも) 必要です。

// This part is pseudo-code for which I would like to have proper code:
JSValueStoreInVarWithName(jsContextRef,"jsName",jsValueRef);

最終的に、Objective-C で次のように呼び出されたときに、この JavaScript が正しく評価されるようにします。

NSString *lJavaScriptScript = @"var jsUppercaseName = jsName.toUpperCase();";
JSStringRef scriptJS = JSStringCreateWithUTF8CString([lJavaScriptScript UTF8String]);
JSValueRef exception = NULL;
JSValueRef result = JSEvaluateScript(jsContextRef, scriptJS, NULL, NULL, 0, &exception);
4

1 に答える 1

1

I found the answer in the sample code for JavaScriptCoreHeadstart, more specifically the JSWrappers.m file. It has this method:

/* -addGlobalStringProperty:withValue: adds a string with the given name to the
 global object of the JavaScriptContext.  After this call, scripts running in
 the context will be able to access the string using the name. */
- (void)addGlobalStringProperty:(NSString *)name withValue:(NSString *)theValue {
    /* convert the name to a JavaScript string */
    JSStringRef propertyName = [name jsStringValue];
    if ( propertyName != NULL ) {
        /* convert the property value into a JavaScript string */
        JSStringRef propertyValue = [theValue jsStringValue];
        if ( propertyValue != NULL ) {            
            /* copy the property value into the JavaScript context */
            JSValueRef valueInContext = JSValueMakeString( [self JSContext], propertyValue );
            if ( valueInContext != NULL ) {                
                /* add the property into the context's global object */
                JSObjectSetProperty( [self JSContext], JSContextGetGlobalObject( [self JSContext] ),
                                propertyName, valueInContext, kJSPropertyAttributeReadOnly, NULL );
            }
            /* done with our reference to the property value */
            JSStringRelease( propertyValue );
        }
        /* done with our reference to the property name */
        JSStringRelease( propertyName );
    }
}

which is exactly what I needed. The code for the jsStringValue method is in NSStringWrappers.m in the same project and is:

/* return a new JavaScriptCore string value for the string */
- (JSStringRef)jsStringValue {
    return JSStringCreateWithCFString( (__bridge CFStringRef) self );
}

This seems to work.

于 2012-10-02T21:05:56.557 に答える