Xamarin Android 綁定 UVCCamera

這段時間工做上須要在Android設備上讀取視頻。攝像頭用的是奧比中光的3D攝像頭。我手上的攝像頭的彩色通道使用的的UVC協議的。java

在Xamarin上可用的UVC的封裝基本上沒有,只有一個小夥在Xamarin的論壇上說到能夠綁定成功,並提供了測試的APK,惋惜是是沒有提供bind的庫。node

沒有辦法了,只能自力更生了。android

1、綁定Java的AAR庫git

這裏有三個原生庫綁定:github

  • usbcameracommon.aar
  • common.aar
  • uvccamera.aar

其中common.aar是最複雜的,裏面有不少地方沒法直接綁定,特別是CollectionMap,這裏面很神奇的put函數怎麼調整都沒法綁定成功,最終只能去掉這個類了。api

其餘的綁定就比較容易了。app

<metadata>
  <attr path="/api/package[@name='com.serenegiant.media']/interface[@name='IRecorder']" name="managedName">IRecorder</attr>
  <attr path="/api/package[@name='com.serenegiant.mediaeffect']/interface[@name='IEffect']" name="managedName">IEffect</attr>
  <attr path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']/method[@name='entrySet' and count(parameter)=0]" name="managedReturn">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']/method[@name='get' and count(parameter)=1 and parameter[1][@type='java.lang.Object']]" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']/method[@name='remove' and count(parameter)=1 and parameter[1][@type='java.lang.Object']]" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']/method[@name='values' and count(parameter)=0]" name="managedReturn">System.Collections.ICollection</attr>
  <attr path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']/method[@name='put' and count(parameter)=2 and parameter[1][@type='K'] and parameter[2][@type='java.util.Collection&lt;V&gt;']]" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']/method[@name='put' and count(parameter)=2 and parameter[1][@type='K'] and parameter[2][@type='java.util.Collection&lt;V&gt;']]" name="managedReturn">Java.Lang.Object</attr>
  <attr path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']/method[@name='put' and count(parameter)=2 and parameter[1][@type='K'] and parameter[2][@type='java.util.Collection&lt;V&gt;']]/parameter[2]" name="managedType">Java.Lang.Object</attr>
  <attr path="/api/package[@name='com.serenegiant.mediaeffect']/class[@name='MediaEffect']/method[@name='resize' and count(parameter)=2 and parameter[1][@type='int'] and parameter[2][@type='int']]" name="managedReturn">Com.Serenegiant.Mediaeffect.IEffect</attr>
  <attr path="/api/package[@name='com.serenegiant.mediaeffect']/class[@name='MediaEffectGLESBase']/method[@name='resize' and count(parameter)=2 and parameter[1][@type='int'] and parameter[2][@type='int']]" name="managedReturn">Com.Serenegiant.Mediaeffect.IEffect</attr>

  <remove-node path="/api/package[@name='com.serenegiant.widget']/class[@name='AspectScaledTextureView']/method[@name='setSurfaceTextureListener' and count(parameter)=1 and parameter[1][@type='android.view.TextureView.SurfaceTextureListener']]" />
  <remove-node path="/api/package[@name='com.serenegiant.utils']/class[@name='CollectionMap']" />
  <remove-node path="/api/package[@name='com.serenegiant.widget']/interface[@name='CustomRecycleViewListener']" />
  <remove-node path="/api/package[@name='com.serenegiant.glutils']/class[@name='EGLBase10']" />
  <remove-node path="/api/package[@name='com.serenegiant.glutils']/class[@name='EGLBase14']" />
</metadata>

因爲一個Android綁定庫只能綁定一個aar,綁定好之後再引用到主項目是有問題的,因此有引用關係的綁定庫之間還須要各自引用相關的的綁定庫。

2、綁定Native庫函數

    Native庫的綁定十分糾結,默認找到的庫是armeabi-v7a的,在Android原生的環境下能夠運行,可是在Xamarin的Android死活不能運行,指認arm64-v8a的庫。測試

    下載了UVCCamera源代碼生成了arm64-v8a後,程序能夠運行起來,但是初始化攝像頭的時候出現「could not open camera:err=-1」,這個在官網看了一下,大多提到了NDK的問題,VS2019安裝的NDK是1.9的。所以刪除後從新安裝1.4的,結果就正常了。google

 

詳細代碼參見GitHub

相關文章
相關標籤/搜索