package com.lody.virtual.client.natives;
import android.hardware.Camera;
import android.media.AudioRecord;
import android.os.Build;
import java.lang.reflect.Method;
import dalvik.system.DexFile;
/**
* @author Lody
*/
public class NativeMethods {
public static int gCameraMethodType;
public static Method gCameraNativeSetup;
public static Method gOpenDexFileNative;
public static Method gAudioRecordNativeCheckPermission;
public static void init() {
String methodName =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? "openDexFileNative" : "openDexFile";
for (Method method : DexFile.class.getDeclaredMethods()) {
if (method.getName().equals(methodName)) {
gOpenDexFileNative = method;
break;
}
}
if (gOpenDexFileNative == null) {
throw new RuntimeException("Unable to find method : " + methodName);
}
gOpenDexFileNative.setAccessible(true);
gCameraMethodType = -1;
try {
gCameraNativeSetup = Camera.class.getDeclaredMethod("native_setup", Object.class, int.class, String.class);
gCameraMethodType = 1;
} catch (NoSuchMethodException e) {
// ignore
}
if (gCameraNativeSetup == null) {
try {
gCameraNativeSetup = Camera.class.getDeclaredMethod("native_setup", Object.class, int.class, int.class, String.class);
gCameraMethodType = 2;
} catch (NoSuchMethodException e) {
// ignore
}
}
// HuaWei common
if (gCameraNativeSetup == null) {
try {
gCameraNativeSetup = Camera.class.getDeclaredMethod("native_setup", Object.class, int.class, int.class, String.class, boolean.class);
gCameraMethodType = 3;
} catch (NoSuchMethodException e) {
// ignore
}
}
// HUAWEI MediaPad X1 7.0
if (gCameraNativeSetup == null) {
try {
gCameraNativeSetup = Camera.class.getDeclaredMethod("native_setup", Object.class, int.class, String.class, boolean.class);
gCameraMethodType = 4;
} catch (NoSuchMethodException e) {
// ignore
}
}
if (gCameraNativeSetup != null) {
gCameraNativeSetup.setAccessible(true);
}
for (Method mth : AudioRecord.class.getDeclaredMethods()) {
if (mth.getName().equals("native_check_permission")
&& mth.getParameterTypes().length == 1
&& mth.getParameterTypes()[0] == String.class) {
gAudioRecordNativeCheckPermission = mth;
mth.setAccessible(true);
break;
}
}
}
}