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.ContextLoader.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 final 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 030 static { 031 try { 032 // MTFSDK JNI接口静态区初始化 033 Class.forName(net.facelib.mtfsdk.V2AndroidBridge.class.getName()); 034 } catch (ClassNotFoundException e) { 035 throw new ExceptionInInitializerError(e); 036 } 037 HashMap<ContextField, Object> m = new HashMap<>(); 038 m.put(ContextField.INSTANCE, getInstance()); 039 m.put(ContextField.LICENCE_MANAGER, licenseManager()); 040 CONTEXT = Collections.unmodifiableMap(m); 041 } 042 043 @Override 044 protected double nativeCompareCode(byte[] code1, byte[] code2) { 045 return V2AndroidBridge.FFSimilarityByteV2(code1,code2); 046 } 047 048 049 @Override 050 public byte[] nativeGetFaceFeature(byte[] imgMatrix, int width, int height, CodeInfo faceInfo) { 051 NativeFaceInfo nativeFaceInfo = NativeFaceInfo.toNative(faceInfo); 052 V2AndroidBridge instance = poolWrap.applyInstance(); 053 try{ 054 sdkRuntime.setInstanceParam(instance,RuntimeParam.featureThreadNumber); 055 return instance.feaExtractByte(imgMatrix, width, height, nativeFaceInfo.nativeData); 056 }finally{ 057 poolWrap.returnInstance(instance); 058 } 059 } 060}