這段時間工做上須要在Android設備上讀取視頻。攝像頭用的是奧比中光的3D攝像頭。我手上的攝像頭的彩色通道使用的的UVC協議的。java
在Xamarin上可用的UVC的封裝基本上沒有,只有一個小夥在Xamarin的論壇上說到能夠綁定成功,並提供了測試的APK,惋惜是是沒有提供bind的庫。node
沒有辦法了,只能自力更生了。android
1、綁定Java的AAR庫git
這裏有三個原生庫綁定:github
其中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<V>']]" 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<V>']]" 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<V>']]/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