|
12 | 12 | public class CallbackInvocationHandler implements InvocationHandler {
|
13 | 13 | private static final String TAG = "CallbackHandler";
|
14 | 14 |
|
15 |
| - private static HashMap<Class<?>, String> sTypeConvert = new HashMap<Class<?>, String>() {{ |
16 |
| - put(int.class, "I"); |
17 |
| - put(float.class, "F"); |
18 |
| - put(double.class, "D"); |
19 |
| - put(boolean.class, "Z"); |
20 |
| - put(String.class, "Ljava/lang/String;"); |
| 15 | + private static final HashMap<String, String> sBasicTypeConvert = new HashMap<String, String>() {{ |
| 16 | + put("int", "java.lang.Integer"); |
| 17 | + put("float", "java.lang.Float"); |
| 18 | + put("double", "java.lang.Double"); |
| 19 | + put("boolean", "java.lang.Boolean"); |
| 20 | + put("byte", "java.lang.Byte"); |
| 21 | + put("short", "java.lang.Short"); |
| 22 | + put("long", "java.lang.Long"); |
| 23 | + put("char", "java.lang.Character"); |
21 | 24 | }};
|
22 | 25 |
|
23 | 26 | @Override
|
24 | 27 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
25 | 28 | Log.d(TAG, "invoke method: " + method.getName());
|
26 |
| - Class<?>[] paramTypes = method.getParameterTypes(); |
27 |
| - String[] params = new String[paramTypes.length]; |
28 |
| - for (int i = 0; i < paramTypes.length; i++) { |
29 |
| - params[i] = sTypeConvert.get(paramTypes[i]); |
| 29 | + int argumentLength = args == null ? 0 : args.length; |
| 30 | + String[] paramsType = new String[argumentLength]; |
| 31 | + for (int i = 0; i < argumentLength; i++) { |
| 32 | + paramsType[i] = args[i] != null ? args[i].getClass().getName() : null; |
30 | 33 | }
|
| 34 | + |
31 | 35 | String funName = method.getName();
|
32 |
| - String returnType = sTypeConvert.get(method.getReturnType()); |
33 |
| - long dartObjectAddr = CallbackManager.getInstance().getRegisterDartAddr(proxy); |
34 |
| - return hookCallback(dartObjectAddr, funName, paramTypes.length, params, args, returnType); |
| 36 | + String returnType = method.getReturnType().getName(); |
| 37 | + returnType = sBasicTypeConvert.get(returnType) == null ? returnType : sBasicTypeConvert.get(returnType); |
| 38 | + long dartObjectAddress = CallbackManager.getInstance().getRegisterDartAddr(proxy); |
| 39 | + |
| 40 | + return hookCallback(dartObjectAddress, funName, argumentLength, paramsType, args, returnType); |
35 | 41 | }
|
36 | 42 |
|
37 |
| - static native Object hookCallback(long dartObjectAddr, String funName, int argCount, String[] argTypes, Object[] args, String returnType); |
| 43 | + static native Object hookCallback(long dartObjectAddress, String funName, int argCount, String[] argTypes, Object[] args, String returnType); |
38 | 44 | }
|
0 commit comments