xamarin android运用seetaface实现人脸识别
1.SeetaImageData类报错
System.Runtime.InteropServices.MarshalDirectiveException: ‘Type SeetaFace6Sharp.v6.SeetaImageData which is passed to unmanaged code must have a StructLayout attribute.’
解决
System.Runtime.InteropServices.MarshalDirectiveException 异常通常发生在从托管代码(例如 C#)向非托管代码(例如 C++)传递结构体时,如果该结构体没有正确的 StructLayout 属性定义
为了修复这个问题,您需要为 SeetaFace6Sharp.v6.SeetaImageData 结构体添加 StructLayout 属性。这将确保结构体在传递给非托管代码时按照预期的方式进行布局和对齐
在该类添加[StructLayout(LayoutKind.Sequential)]
2.使用native层方法报错
报错:10-19 03:40:47.531 12017 12017 D Seeta : -------gu— [native_detector]->nativeCreateEngine
--------- beginning of crash
10-19 03:40:47.531 12017 12017 F libc : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x752f6174616977 in tid 12017 (seetaface6sharp), pid 12017 (seetaface6sharp)
解决
需要修改native层方法
修改前方法如下,使用了该方法将传入的model路径进行了转换,env->GetStringUTFChars(model, nullptr)
extern "C" JNIEXPORT jint JNICALL Java_com_seetaface_v6_FaceDetector_nativeCreateEngine
(JNIEnv *env, jobject obj, jstring model) {
LOGD("-------gu--- [native_detector]->nativeCreateEngine");
if (gFaceDetector != nullptr) {
LOGW("-------gu--- [native_detector]->nativeCreateEngine engine has been created");
return EXIT_FAILURE;
}
LOGD("-------gu--- [native_detector]->nativeCreateEngine1");
int result = EXIT_FAILURE;
LOGD("-------gu--- [native_detector]->nativeCreateEngine3:%d",result);
seeta::ModelSetting modelSetting(seeta::ModelSetting::AUTO, 0);
LOGD("-------gu--- [native_detector]->nativeCreateEngine4");
if (model != nullptr) {
LOGD("-------gu--- [native_detector]->nativeCreateEngine7");
if(env == nullptr){
LOGD("-------gu--- [native_detector]->nativeCreateEngine6");
return EXIT_FAILURE;
}
LOGD("-------gu--- [native_detector]->nativeCreateEngine10");
const char *modelFile = env->GetStringUTFChars(model, nullptr);
LOGD("-------gu--- [native_detector]->nativeCreateEngine modelFile:%s", modelFile);
if (modelFile != nullptr) {
modelSetting.append(modelFile);
env->ReleaseStringUTFChars(model, modelFile);
result = EXIT_SUCCESS;
}
}
if (result == EXIT_SUCCESS) {
gFaceDetector = new seeta::FaceDetector(modelSetting);
LOGD("-------gu--- [native_detector]->nativeCreateEngine8");
}
result = gFaceDetector != nullptr ? EXIT_SUCCESS : EXIT_FAILURE;
return (jint)result;
}
extern "C" JNIEXPORT jint JNICALL Java_com_seetaface_v6_FaceDetector_nativeCreateEngine
(JNIEnv *env, jobject obj, jstring model) {
LOGD("-------gu--- [native_detector]->nativeCreateEngine");
if (gFaceDetector != nullptr) {
LOGW("-------gu--- [native_detector]->nativeCreateEngine engine has been created");
return EXIT_FAILURE;
}
LOGD("-------gu--- [native_detector]->nativeCreateEngine1");
int result = EXIT_FAILURE;
LOGD("-------gu--- [native_detector]->nativeCreateEngine3:%d",result);
seeta::ModelSetting modelSetting(seeta::ModelSetting::AUTO, 0);
LOGD("-------gu--- [native_detector]->nativeCreateEngine4");
if (model != nullptr) {
LOGD("-------gu--- [native_detector]->nativeCreateEngine7");
if(env == nullptr){
LOGD("-------gu--- [native_detector]->nativeCreateEngine6");
return EXIT_FAILURE;
}
LOGD("-------gu--- [native_detector]->nativeCreateEngine10");
const char *modelFile = "/data/user/0/com.companyname.seetaface6sharp/files/SeetaFace6/models/face_detector.csta";
LOGD("-------gu--- [native_detector]->nativeCreateEngine modelFile:%s", modelFile);
if (modelFile != nullptr) {
modelSetting.append(modelFile);
LOGD("-------gu--- [native_detector]->nativeCreateEngine12");
//env->ReleaseStringUTFChars(model, modelFile);
result = EXIT_SUCCESS;
}
}
if (result == EXIT_SUCCESS) {
LOGD("-------gu--- [native_detector]->nativeCreateEngine13");
gFaceDetector = new seeta::FaceDetector(modelSetting);
LOGD("-------gu--- [native_detector]->nativeCreateEngine8");
}
result = gFaceDetector != nullptr ? EXIT_SUCCESS : EXIT_FAILURE;
return (jint)result;
}
native层报错信息
10-18 22:10:32.887 7872 7872 F DEBUG : backtrace:
10-18 22:10:32.887 7872 7872 F DEBUG : #00 pc 00000000002dec78 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #01 pc 00000000002d9730 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #02 pc 00000000001177cc /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #03 pc 00000000003ccf08 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #04 pc 00000000002ddc80 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #05 pc 00000000003c57a8 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #06 pc 00000000003ed350 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #07 pc 00000000003e5db8 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #08 pc 00000000003e5978 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #09 pc 00000000000ad314 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libTenniS.so (ts_Workbench_run+88) (BuildId: 32548db30b09bb7b7af923266011dbc3d7706577)
10-18 22:10:32.887 7872 7872 F DEBUG : #10 pc 000000000004ff6c /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libSeetaFaceDetector600.so (BuildId: 8fc621bcb45c3b59078f95843f12920f8ba8ce44)
10-18 22:10:32.887 7872 7872 F DEBUG : #11 pc 00000000000073fc /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libFaceDetector.so (Java_com_seetaface_v6_FaceDetector_nativeDetectFaces+388) (BuildId: efeeced939bcbe2c6c1e1ea52c544de6cf846f27)
10-18 22:10:32.887 7872 7872 F DEBUG : #12 pc 0000000000222244 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: 4925dbfec35f1037f8ee5dab9b73e87d)
10-18 22:10:32.887 7872 7872 F DEBUG : #13 pc 0000000000212520 /apex/com.android.art/lib64/libart.so (nterp_helper+4016) (BuildId: 4925dbfec35f1037f8ee5dab9b73e87d)
10-18 22:10:32.887 7872 7872 F DEBUG : #14 pc 000000000046a6e4 [anon:dalvik-classes.dex extracted in memory from /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/base.apk] (com.seetaface.v6.FaceDetector.detectFaces+0)
10-18 22:10:32.887 7872 7872 F DEBUG : #15 pc 0000000000218964 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: 4925dbfec35f1037f8ee5dab9b73e87d)
10-18 22:10:32.887 7872 7872 F DEBUG : #16 pc 0000000000284208 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+188) (BuildId: 4925dbfec35f1037f8ee5dab9b73e87d)
10-18 22:10:32.887 7872 7872 F DEBUG : #17 pc 000000000061fab0 /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithJValues<art::ArtMethod*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, jvalue const*)+460) (BuildId: 4925dbfec35f1037f8ee5dab9b73e87d)
10-18 22:10:32.887 7872 7872 F DEBUG : #18 pc 00000000004cc0dc /apex/com.android.art/lib64/libart.so (art::JNI<true>::CallObjectMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue const*)+612) (BuildId: 4925dbfec35f1037f8ee5dab9b73e87d)
10-18 22:10:32.887 7872 7872 F DEBUG : #19 pc 0000000000445e18 /apex/com.android.art/lib64/libart.so (art::(anonymous namespace)::CheckJNI::CallMethodA(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, jvalue const*, art::Primitive::Type, art::InvokeType)+1328) (BuildId: 4925dbfec35f1037f8ee5dab9b73e87d)
10-18 22:10:32.887 7872 7872 F DEBUG : #20 pc 00000000000074c8 /data/app/~~OcfVqT3kWEmtU7UdEGajXw==/com.companyname.seetaface6sharp--Rcwuyse0mVih6YouEgrNA==/lib/arm64/libxa-internal-api.so (java_interop_jnienv_call_object_method_a+48) (BuildId: 187068fd6e47397d297a3c24918af57f6f00d96b)
10-18 22:10:32.887 7872 7872 F DEBUG : #21 pc 0000000000006cb8 <anonymous:7abfcb9000>
从堆栈信息可以看到ts_Workbench_run+88报错,这个错误是设置CPU错误
解决
将AndroidManifest中的mini version和target version修改至29以下就能解决

xamarin android添加jar、aar文件
1. 首先右击项目的解决方案,选择新建项目

2. 添加新项目–Android绑定库

3. 修改项目名称后,点击创建

4. 就能在项目里面看到刚刚创建的项目

5. 然后把需要绑定的jar和aar文件添加至Jars文件夹里面,需要绑定不同的Android文件则需要创建多个Android绑定库
添加jar文件至Android绑定库中,然后修改添加的文件生成操作,设置为EmbeddedJar

添加aar文件至Android绑定库中,修改添加的文件生成操作,设置为LibraryProjectZip

6. 修改之后,右击Android绑定库项目名,点击生成

然后就在该项目下的能看到生成的dll文件

7. 最后把生成的dll文件添加至所需要的项目中,右击项目名后点击引用-添加引用

在项目这一栏就能看到刚刚产生的绑定库,点击确定后就能使用库里面的方法了

双击引用后的库,会看到库里面的方法,然后使用下面的语句就能调用这些方法了
using Com.Seetaface.V6

8. 如果添加的Android绑定库需要引用.so文件,那就需要将所需要的so库文件添加至项目中的jniLibs文件夹(自己创建的,名字随意)

9. 修改添加的so库文件生成操作,设置为AndroidNativeLibrary

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)