2016-07-20 8 views
0

XamarinのAndroidアプリにネイティブライブラリをインポートしようとしています。私はtest.soファイルをビルドしており、適切なDllopenコードが含まれています。問題は、私が "DllImportエラーライブラリを読み込む"エラーがスローされ続けるアプリケーションを展開しようとするときです。ここには完全なエラーがあります。Xamarin Android:アプリケーションにネイティブライブラリを含むエラー

> DllImport attempting to load: 'test'. 07-20 11:07:26.428 D/Mono 
> (11429): DllImport error loading library 
> '/storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest': 
> 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest" 
> not found'. 07-20 11:07:26.428 D/Mono (11429): DllImport error 
> loading library 
> '/storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest.so': 
> 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest.so" 
> not found'. 07-20 11:07:26.428 D/Mono (11429): DllImport error 
> loading library '/system/lib/libtest': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//system/lib/libtest" 
> not found'. 07-20 11:07:26.428 D/Mono (11429): DllImport error 
> loading library '/system/lib/libtest.so': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//system/lib/libtest.so" 
> not found'. 07-20 11:07:26.428 D/Mono (11429): DllImport error 
> loading library 'libtest': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest" not found'. 
> 07-20 11:07:26.428 D/Mono (11429): DllImport error loading library 
> 'libtest.so': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest.so" not found'. 
> 07-20 11:07:26.428 D/Mono (11429): DllImport error loading library 
> 'test': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/test" not found'. 07-20 
> 11:07:26.438 D/Mono (11429): DllImport error loading library 
> '/storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest': 
> 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library 
> '/storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest.so': 
> 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest.so" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library '/system/lib/libtest': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//system/lib/libtest" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library '/system/lib/libtest.so': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//system/lib/libtest.so" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library 'libtest': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest" not found'. 
> 07-20 11:07:26.438 D/Mono (11429): DllImport error loading library 
> 'libtest.so': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest.so" not found'. 
> 07-20 11:07:26.438 D/Mono (11429): DllImport error loading library 
> 'libtest': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest" not found'. 
> 07-20 11:07:26.438 W/Mono (11429): DllImport unable to load library 
> 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest" not found'. 
> 07-20 11:07:26.438 D/Mono (11429): DllImport attempting to load: 
> 'test'. 07-20 11:07:26.438 D/Mono (11429): DllImport error loading 
> library 
> '/storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest': 
> 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library 
> '/storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest.so': 
> 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//storage/emulated/0/Android/data/XammarinDemo.XammarinDemo/files/.__override__/libtest.so" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library '/system/lib/libtest': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//system/lib/libtest" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library '/system/lib/libtest.so': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm//system/lib/libtest.so" 
> not found'. 07-20 11:07:26.438 D/Mono (11429): DllImport error 
> loading library 'libtest': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest" not found'. 
> 07-20 11:07:26.438 D/Mono (11429): DllImport error loading library 
> 'libtest.so': 'dlopen failed: library 
> "/data/app/XammarinDemo.XammarinDemo-1/lib/arm/libtest.so" not found'. 

ここに記載されているような方法に従った。https://developer.xamarin.com/guides/android/advanced_topics/using_native_libraries/。 libtest.soがapkに解凍されていることが確認されましたが、アンドロイドは.soファイルの検索に問題があるようです。この問題を解決するにはどうすればよいですか?

+0

この問題の一般的な原因の1つは、テストデバイスまたはエミュレータのアーキテクチャ用にライブラリが提供されていない場合です。パススニッフィングを使用するか、それぞれのターゲット展開アーキテクチャのために ''要素を適切に設定することが重要です。 –

+0

適切な 'Build Action'セットがありますか?次に、適切なアーキテクチャに '.so'が含まれていますか? http://ph0b.com/android-abis-and-so-files/ –

+0

@BrendanZagaeski私はHTC Oneの携帯電話でテストしています。ここでは、armeabi-v7フォルダの下にlibtest.soがあります。 https://developer.xamarin.com/guides/android/advanced_topics/using_native_libraries/また、armeabiという名前のフォルダの下に配置しようとしましたが、どちらも動作しませんでした。 – Oyebisi

答えて

1

あなたが言及したxamarinドキュメントによると、リンカに何が何であるかを知らせるために、パススニッフィングまたはプロジェクトファイルを使用できます。

現在、パススニッフィングはVisual Studioでは実際には機能しません。あなたのDLLは、ARM、ARM64などと呼ばれるディレクトリに置かれます。そして、パス 'sniffer'は、パスがarmeabi、armeabi-v7aなどとなることを期待しています。すべてのプラットフォームの出力パスを変更するか、プロジェクトファイルを変更することができます。あなたは(外部エディタで手動で編集する必要がある)プロジェクトファイルのために行く場合は

、結果はこのようなものになります。

<ItemGroup> 
<EmbeddedNativeLibrary Include="..\CD.AndroidDll\Release\ARM64\libDemo.so"> 
    <Link>lib\arm64\libDemo.so</Link> 
    <ABI>arm64-v8a</ABI> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</EmbeddedNativeLibrary> 
<EmbeddedNativeLibrary Include="..\CD.AndroidDll\Release\ARM\libDemo.so"> 
    <Link>lib\arm\libDemo.so</Link> 
    <ABI>armeabi-v7a</ABI> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</EmbeddedNativeLibrary> 
<EmbeddedNativeLibrary Include="..\CD.AndroidDll\Release\x64\libDemo.so"> 
    <Link>lib\x64\libDemo.so</Link> 
    <ABI>x86_64</ABI> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</EmbeddedNativeLibrary> 
<EmbeddedNativeLibrary Include="..\CD.AndroidDll\Release\x86\libDemo.so"> 
    <Link>lib\x86\libDemo.so</Link> 
    <ABI>x86</ABI> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</EmbeddedNativeLibrary> 
<None Include="Resources\AboutResources.txt" /> 

を残した唯一の問題はarmeabiですvs armeabi-v7aアプリケーションがarmeabi-v7aデバイスのarmeabiフォルダを調べていないようです。両方のABI定義を同じリンクライブラリに追加すると、2番目のものだけが使用されます。また、同じファイルを2度リンクすることもできません。

あなたの唯一の選択肢は、ライブラリのマニュアルコピーを作成して追加することです。それとも、アーマービを残しておくだけです。結局のところ、現在armeabi-v7aをサポートしていないデバイスを見つけるのは難しいでしょう。

関連する問題