001package net.facelib.mtfsdk; 002 003import static net.facelib.mtfsdk.V2AndroidBridge.V2_PRODUCT_ID; 004import static net.facelib.mtfsdk.V2AndroidBridge.V2_LICENSE_MANAGER; 005 006import java.util.Collections; 007import java.util.HashMap; 008import java.util.Map; 009import java.util.concurrent.atomic.AtomicLong; 010 011import org.apache.commons.pool2.impl.GenericObjectPool; 012import org.apache.commons.pool2.impl.GenericObjectPoolConfig; 013 014import net.facelib.akcore.LicenseManager; 015import net.facelib.akcore.ProductInitStatus; 016import net.facelib.jni.BaseJniBridge; 017import net.facelib.jni.BridgePool; 018import net.facelib.jni.FacelibRuntimeParam; 019import net.gdface.image.MatType; 020import net.gdface.sdk.CodeInfo; 021import net.gdface.sdk.ContextLoader.ContextField; 022 023/** 024 * MTFSDK V2 android/arm平台 {@link net.gdface.sdk.FaceApi}接口实现抽象类(线程安全)<br> 025 * @author guyadong 026 * 027 */ 028public class FaceApiMtfV2Android extends BaseFaceApiMtfAndroid{ 029 /** 030 * 资源池参数配置 031 */ 032 private static GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); 033 public static final FaceApiMtfV2Android INSTANCE = new FaceApiMtfV2Android(); 034 static final Map<ContextField, Object> CONTEXT; 035 /** 036 * 特征提取算法实例资源 037 */ 038 private final BridgePool<V2AndroidBridge> poolWrap = new BridgePool<>(V2AndroidBridge.class,poolConfig); 039 protected FaceApiMtfV2Android() { 040 super(); 041 capacity.put(C_SDK_VERSION, V2AndroidBridge.SDK_VERSION); 042 } 043 044 public static FaceApiMtfV2Android getInstance(){ 045 return INSTANCE; 046 } 047 048 /** 049 * 获取授权管理对象 050 * @return 授权管理对象 051 */ 052 public LicenseManager getLicenseManager(){ 053 return BaseJniBridge.getLicenseManager(V2_PRODUCT_ID, V2_LICENSE_MANAGER); 054 } 055 static { 056 try { 057 // MTFSDK JNI接口静态区初始化 058 Class.forName(net.facelib.mtfsdk.V2AndroidBridge.class.getName()); 059 } catch (ClassNotFoundException e) { 060 throw new ExceptionInInitializerError(e); 061 } 062 HashMap<ContextField, Object> m = new HashMap<>(); 063 m.put(ContextField.INSTANCE, getInstance()); 064 m.put(ContextField.LICENCE_MANAGER, BaseJniBridge.getLicenseManager(V2_PRODUCT_ID, V2_LICENSE_MANAGER)); 065 CONTEXT = Collections.unmodifiableMap(m); 066 } 067 068 @Override 069 protected double nativeCompareCode(byte[] code1, byte[] code2) { 070 return V2AndroidBridge.FFSimilarityByteV2(code1,code2); 071 } 072 073 074 @Override 075 protected byte[] nativeGetFaceFeature(MatType matType,byte[] imgMatrix, int width, int height, CodeInfo faceInfo) { 076 NativeFaceInfo nativeFaceInfo = NativeFaceInfo.toNative(faceInfo); 077 V2AndroidBridge instance = poolWrap.applyInstance(); 078 try{ 079 sdkRuntime.setInstanceParam(instance,FacelibRuntimeParam.featureThreadNumber.name()); 080 return instance.feaExtractByte(matType, imgMatrix, width, height, nativeFaceInfo.nativeData); 081 }finally{ 082 poolWrap.returnInstance(instance); 083 } 084 } 085 086 @Override 087 public void bindNativeFeatureInstanceForCurentThread() { 088 poolWrap.bindInstanceForCurentThread(); 089 } 090 091 @Override 092 public void unbindNativeFeatureInstanceForCurentThread() { 093 poolWrap.unbindInstanceForCurentThread(); 094 } 095 096 /** 097 * 测试是否可以正常初始化特征提取算法实例 098 * @param initMills [out]如果不为{@code null}返回返回初始化耗时(毫秒) 099 * @return 产品初始化状态 100 */ 101 public ProductInitStatus testV2Init(AtomicLong initMills) { 102 return BaseJniBridge.testInit(initMills, V2AndroidBridge.class); 103 } 104 /** 105 * @return 返回V2特征提取算法实例资源池对象 106 */ 107 public GenericObjectPool<V2AndroidBridge> getFeaturePool() { 108 return poolWrap.getPool(); 109 } 110 /** 111 * 返回V2特征提取算法资源池对象参数配置 112 * @return poolConfig 113 */ 114 public static GenericObjectPoolConfig getPoolConfig() { 115 return poolConfig; 116 } 117 /** 118 * 设置V2特征提取算法资源池对象参数配置 119 * @param poolConfig 要设置的 poolConfig 120 */ 121 public static void setPoolConfig(GenericObjectPoolConfig poolConfig) { 122 if(null != poolConfig){ 123 FaceApiMtfV2Android.poolConfig = poolConfig; 124 } 125 } 126}