###前提・実現したいこと
別の質問で投げていましたが、原因が絞れてきたので新しい質問としてあげ直します。
既存のsoファイル(あとのログ中のlibsd_xxx.so)内の関数を扱う関数をC++で自分で実装しこちらもsoファイル化したもの(同じくlibXXX.so)、Xamarinの中に組み込んで使っています。
テストで使っていた端末では特に問題が起きていなかったので安心をしていたのですが、別の端末でテストしたらことごとく関数を呼ぶところで異常終了してしまいました。
どうやら、端末のOSのバージョンが4.4.2?くらいから上だと大丈夫なようで、それより古いと異常終了してしまうみたいです。
ログより原因は特定できていて、異常終了する端末では既存のsoファイルの読み込みに失敗しているようです。
(ログは長くなるのでこちらを参照ください)
もともと既存のsoファイルはeclipseで使うことを想定したもので、
eclipseから(というかJava + JNIで)は古い端末でも問題なく動きました。
javaから呼び出す時は、そのclassの頭に、
static { System.loadLibrary("sd_xxx"); System.loadLibrary("XXX"); }
と書いています。
ためしに、sd_xxxの行をコメントアウトしてみたところ、Xamarinと同じく
新しい端末では普通に動くし、古い端末ではエラーが出るという症状が再現できました。
なのでXamarin側で明示的に
System.loadLibrary("sd_xxx");
のようなことがかければ問題が解決すると踏んでいます。
古い端末でもsd_xxx.soを強制的に読み込むようにするにはどのような書き方をすればよろしいでしょうか?
アドバイス宜しくお願いします。
###該当のソースコード
実際にlibsd_xxx.so内の関数呼び出しに関係するところを貼り付けておきます。
XXXPage.cs
namespace XaXXXXX { public class XXXPage : ContentPage { public XXXPage() { Content = new StackLayout { Children = { // 省略 } }; Appearing += (sender, e) => { XXXInit();//呼び出し元 }; this.Disappearing += (sender, e) => { XXXTerm(); }; } void XXXInit() { DependencyService.Get<IMisc>().XXXInit(); } void XXXTerm() { DependencyService.Get<IMisc>().XXXTerm(); } } }
iMisc.cs
using System; namespace XaXXXXX { public interface IMisc { void XXXInit(); void XXXTerm(); } }
Droid/Misc.cs
[assembly: Xamarin.Forms.Dependency(typeof(Misc))] namespace XaXXXXX.Droid { public class Misc : IMisc { [DllImport("XXX")] public static extern void XXXinitialize(); [DllImport("XXX")] public static extern int XXXterminate(); public void XXXInit() { XXXinitialize(device, ver, false); // libsd_xxx.so内の関数 } public void XXXTerm() { XXXterminate(); } } }
###補足情報(言語/FW/ツール等のバージョンなど)
Xamarin 6.3(build 864)
Mac Note Pro
OS X Yosemite(10.10.5)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/06 02:17
2017/09/06 06:19