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}