001package net.facelib.mtfsdk;
002
003import java.util.Collections;
004import java.util.HashMap;
005import java.util.Map;
006
007import net.facelib.jni.BridgePool;
008import net.facelib.jni.SdkRuntime.RuntimeParam;
009import net.gdface.sdk.CodeInfo;
010import net.gdface.sdk.FaceApiContext.ContextField;
011
012/**
013 * MTFSDK V2 android/arm平台 {@link net.gdface.sdk.FaceApi}接口实现抽象类(线程安全)<br>
014 * @author guyadong
015 *
016 */
017public class FaceApiMtfV2Android extends BaseFaceApiMtfAndroid{
018        public static final FaceApiMtfV2Android INSTANCE = new FaceApiMtfV2Android();
019        static Map<ContextField, Object> CONTEXT;
020        private final BridgePool<V2AndroidBridge> poolWrap = new BridgePool<>(V2AndroidBridge.class);
021        protected FaceApiMtfV2Android() {
022                super();
023                capacity.put(C_SDK_VERSION, V2AndroidBridge.SDK_VERSION);
024        }
025        
026        public static FaceApiMtfV2Android getInstance(){
027                return INSTANCE;
028        }
029        @Override
030        public final String sdkVersion() {
031                return V2AndroidBridge.SDK_VERSION;
032        }
033
034        static {
035                try {
036                        // MTFSDK JNI接口静态区初始化
037                        Class.forName(net.facelib.mtfsdk.V2AndroidBridge.class.getName());
038                } catch (ClassNotFoundException e) {
039                        throw new ExceptionInInitializerError(e);
040                }
041                HashMap<ContextField, Object> m = new HashMap<>();
042                m.put(ContextField.INSTANCE, getInstance());
043                m.put(ContextField.LICENCE_MANAGER, licenseManager());
044                CONTEXT = Collections.unmodifiableMap(m);
045        }
046
047        @Override
048        protected double nativeCompareCode(byte[] code1, byte[] code2) {
049                return V2AndroidBridge.FFSimilarityByteV2(code1,code2);
050        }
051
052
053        @Override
054        public byte[] nativeGetFaceFeature(byte[] imgMatrix, int width, int height, CodeInfo faceInfo) {
055                NativeFaceInfo nativeFaceInfo = NativeFaceInfo.toNative(faceInfo);
056                V2AndroidBridge instance = poolWrap.applyInstance();
057                try{
058                        sdkRuntime.setInstanceParam(instance,RuntimeParam.featureThreadNumber);
059                         return instance.feaExtractByte(imgMatrix, width, height, nativeFaceInfo.nativeData);
060                }finally{
061                        poolWrap.returnInstance(instance);
062                }
063        }
064}