2016-07-20 3 views
0

Ich versuche, native Bibliothek in meine Xamarin Android App zu importieren. Ich habe die Datei test.so erstellt und den entsprechenden Dllopen-Code hinzugefügt. Das Problem ist, wenn ich versuche, die Anwendung bereitzustellen, bekomme ich einen Fehler "DllImport error loading library" geworfen. Hier ist der Fehler vollständig.Xamarin Android: Fehler einschließlich nativer Bibliothek in Anwendung

> 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'. 

folgte ich den Prozess wie hier https://developer.xamarin.com/guides/android/advanced_topics/using_native_libraries/ beschrieben. Ich habe bestätigt, dass der libtest.so in der apk enthalten ist, indem ich ihn entzippe, aber es scheint, dass Android Probleme hat, die .so-Datei zu finden. Wie kann ich dieses Problem beheben?

+0

Eine häufige Ursache für dieses Problem ist, wenn die Bibliothek nicht für die Architektur des Testgeräts oder Emulators bereitgestellt wurde. Es ist wichtig, Pfad-Sniffing zu verwenden oder das Element ' 'entsprechend für jede Bereitstellungsarchitektur zu setzen. –

+0

Haben Sie das richtige 'Build Action' Set? Zweitens, ist das '.so' für die richtige Architektur enthalten? http://ph0b.com/android-abis-and-so-files/ –

+0

@ BrendanZagaeski Ich teste auf einem HTC One Telefon und ich habe die libtest.so unter dem armeabi-v7-Ordner gemäß den Anweisungen hier. https://developer.xamarin.com/guides/android/advanced_topics/using_native_libraries/ Ich habe auch versucht, es unter einem Ordner namens armeabi, beide nicht funktioniert – Oyebisi

Antwort

1

Gemäß den von Ihnen genannten Xamarin-Dokumenten können Sie entweder den Pfad-Sniffing oder die Projektdatei verwenden, damit der Linker weiß, was was ist.

Jetzt funktioniert Pfad-Sniffing nicht wirklich mit Visual Studio. Ihre DLLs werden in die Verzeichnisse ARM, ARM64 usw. geschrieben. Und der Pfad 'Sniffer' erwartet, dass der Pfad wie arméabi, armeabi-v7a und so weiter ist. Sie können den Ausgabepfad für jede Plattform ändern oder Ihre Projektdatei ändern.

Falls Sie für die Projektdatei gehen (die manuell in einem externen Editor bearbeitet werden sollte), sollte das Ergebnis wie folgt aussehen:

<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" /> 

Das einzige Problem ist zur armeabi gegen armeabi-v7a. Es scheint, dass die Anwendung nicht in den Armea-Ordner auf einem Armea-v7a-Gerät schaut. Wenn Sie beide ABI-Definitionen derselben verknüpften Bibliothek hinzufügen, wird nur die zweite verwendet. Sie können die gleiche Datei auch nicht zweimal verknüpfen.

Ihre einzige Option wäre, eine manuelle Kopie der Bibliothek zu machen und diese hinzuzufügen. Oder lassen Sie Armee ganz weg. Schließlich würde es Ihnen schwer fallen, ein Gerät zu finden, das arméabi-v7a heutzutage nicht unterstützt.

Verwandte Themen