| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.weex.jsEngine; |
| |
| import org.apache.weex.base.CalledByNative; |
| import org.apache.weex.bridge.WXBridgeManager; |
| import org.apache.weex.utils.WXLogUtils; |
| |
| import java.io.Serializable; |
| import java.util.concurrent.ConcurrentHashMap; |
| |
| import static org.apache.weex.jsEngine.JSEngine.mCreatedJSContext; |
| |
| public class JSContext implements Serializable { |
| private ConcurrentHashMap<String, JSFunction> funcMap = new ConcurrentHashMap<>(); |
| //JSEnginePtrContainer |
| private long mNativeContextPtr = 0; |
| |
| private JSException mExceptionTransfer = null; |
| |
| protected JSContext() { |
| WXBridgeManager.getInstance().post(new Runnable() { |
| @Override |
| public void run() { |
| mNativeContextPtr = nativeCreateContext(); |
| mCreatedJSContext.put(mNativeContextPtr, JSContext.this); |
| } |
| }); |
| } |
| |
| public void registerException(JSException e) { |
| mExceptionTransfer = e; |
| } |
| |
| public void destroy() { |
| mCreatedJSContext.remove(mNativeContextPtr); |
| mExceptionTransfer = null; |
| WXBridgeManager.getInstance().post(new Runnable() { |
| @Override |
| public void run() { |
| if (mNativeContextPtr != 0) { |
| long tmp = mNativeContextPtr; |
| mNativeContextPtr = 0; |
| nativeDestroyContext(tmp); |
| } |
| } |
| }); |
| } |
| |
| public void bindFunction(final String name, final JSFunction function) { |
| WXBridgeManager.getInstance().post(new Runnable() { |
| @Override |
| public void run() { |
| funcMap.put(name, function); |
| nativeBindFunc(mNativeContextPtr, name); |
| } |
| }); |
| } |
| |
| public void unBindFunction(final String name) { |
| WXBridgeManager.getInstance().post(new Runnable() { |
| @Override |
| public void run() { |
| funcMap.remove(name); |
| nativeUnBindFunc(mNativeContextPtr, name); |
| } |
| }); |
| } |
| |
| public void Eval(final String script) { |
| WXBridgeManager.getInstance().post(new Runnable() { |
| @Override |
| public void run() { |
| nativeExecJS(mNativeContextPtr, script); |
| } |
| }); |
| } |
| |
| |
| @CalledByNative |
| public String Invoke(String name, String args) { |
| JSFunction jsFunction = funcMap.get(name); |
| if (jsFunction != null) { |
| WXLogUtils.d("jsEngine invoke " + name + " arg:" + args); |
| return jsFunction.invoke(args); |
| } |
| return ""; |
| } |
| |
| @CalledByNative |
| public void Exception(String exception) { |
| if (exception != null && mExceptionTransfer != null) { |
| this.mExceptionTransfer.exception(exception); |
| } |
| } |
| |
| private native long nativeCreateContext(); |
| |
| private native void nativeDestroyContext(long ctxPtr); |
| |
| private native void nativeBindFunc(long ctxPtr, String name); |
| |
| private native void nativeUnBindFunc(long ctxPtr, String name); |
| |
| private native void nativeExecJS(long ctxPtr, String script); |
| } |