[問題] 用mono c# 無法載入 android 的 library

看板AndroidDev作者 (用功點吧!)時間8年前 (2015/08/28 03:17), 8年前編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/1
想請教一下版上的大大關於 mono 的問題,問題如下: 我有一個需求,是在arm的平台上,使用 mono 寫c#,並且load library,這隻.so是 包在apk裡面的,已經unzip拉出來。 但是不管我用什麼方法,mono總是跟我說找不到這個 so 檔,但是他明明就在orz 我試過: 1. 把 .so和.exe放一起 2. 把 .so放到 /usr/lib, 並執行ldconfig更新library cache, 確定 ldconfig -p 有看到該so檔 3. export LD_LIBRARY_PATH ="./" 4. 用不同的表示方法去load…像是 [DllImport("libChronicleNUtils.so")], [DllImport(@"/usr/lib/libChronicleNUtils.so")] [DllImport("ChronicleNUtils")] 都會失敗,失敗訊息如下: Mono: DllImport attempting to load: 'ChronicleNUtils'. Mono: DllImport error loading library '/home/pi/libChronicleNUtils': '/home/pi/libChronicleNUtils: cannot open shared object file: No such file or directory'. Mono: DllImport error loading library '/home/pi/libChronicleNUtils.so': '/home/pi/libChronicleNUtils.so: cannot open shared object file: No such file or directory'. (略...) Unhandled Exception: System.DllNotFoundException: ChronicleNUtils at (wrapper managed-to-native) NativePlugin:breakData_ (intptr,int,int) at NativePlugin.breakData (System.Byte[] data, Boolean isData) [0x00000] in <filename unknown>:0 at NativePlugin.Main (System.String[] args) [0x00000] in <filename unknown>:0 [ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: ChronicleNUtils at (wrapper managed-to-native) NativePlugin:breakData_ (intptr,int,int) at NativePlugin.breakData (System.Byte[] data, Boolean isData) [0x00000] in <filename unknown>:0 at NativePlugin.Main (System.String[] args) [0x00000] in <filename unknown>:0 我100%確定 /home/pi/libChronicleNUtils.so 是存在的, 但是在debug訊息卻說找不到.. 請大家幫幫忙,找了很久找不到原因,附上簡單的source code =============================================== using System.Runtime.InteropServices; using System; using System.Text; public static class NativePlugin { [DllImport("ChronicleNUtils")] private static extern byte breakData_(IntPtr data, int data_size, int bd); public static void breakData(byte[] data, bool isData) { GCHandle gCHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr data2 = gCHandle.AddrOfPinnedObject(); NativePlugin.breakData_(data2, data.Length, (!isData) ? 60 : 221); gCHandle.Free(); } static int Main(string[] args) { bool isData = false; byte[] data =System.Text.Encoding.Default.GetBytes("test data"); NativePlugin.breakData(data, isData); return 0; } } ============================================================== 其他資訊: file /home/pi/libChronicleNUtils.so /home/pi/libChronicleNUtils.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, stripped uname -a Linux raspberrypi 3.10.26+ #2 Fri Jan 17 22:13:59 EST 2014 armv6l GNU/Linux -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.35.97.50 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1440703059.A.04F.html ※ 編輯: Nt1 (114.35.97.50), 08/28/2015 03:20:50 ※ Nt1:轉錄至看板 C_Sharp 08/28 03:21

08/30 21:51, , 1F
程式的執行路徑在 /home/pi 下嗎?
08/30 21:51, 1F

09/02 00:25, , 2F
是的!
09/02 00:25, 2F
文章代碼(AID): #1Lts9J1F (AndroidDev)