[英]First DllNotFoundException then EntryPointNotFoundException while calling pure C function from C#
我想在Unity3D pro中使用一些C代碼。
我的基本方法是(1)將C源代碼構建到靜態庫中(2)創建一個空包並鏈接到庫(3)將包導入Unity 3D pro(作為插件)。
我基本上是按照本教程 。
它一直在為我工作一段時間,直到最近我更新我的C代碼並重新編譯和重建庫和捆綁包,一切都出錯了......
當我第一次導入捆綁包時,我得到了一個DllNotFoundException 。
在那個階段,我的bundle項目只是一堆庫 - 從我的源代碼(一個.a文件)構建的庫和我認為.a庫所依賴的一些其他庫(其他庫具有.dylib擴展名) )。
我在bundle中添加了一個test.c文件。 測試.c文件只包含兩行:
#include <stdio.h>
#include "ccn.h"
char* say()
{
return "hi";
}
其中ccn.h是我的C源代碼中的頭文件。
在我重新構建捆綁包之后, DllNotFoundExeption消失了,但我得到了一個EntryPointNotFoundException 。
很多和很多的感謝!
另外我在Apple的文檔中看到了一些我不太明白的東西:
如果可加載包是一個插件,則主機應用程序開發人員通常在框架中為插件體系結構提供接口。 此框架通常包含所有插件主體類繼承的類,或者插件的主體類要采用的協議(正式或非正式)。
我很確定我創建的可加載包是一個插件。 我正在將捆綁包導入Unity3D。 這是否意味着我應該從Unity定義一個主要類? 怎么樣?
問題有一個簡單的解決方案:
嘗試先在test.c文件中為您提供EntryPointNotFoundException的任何函數。
通過“試用”我的意思是,在main()中調用函數並首先在C中測試它。
在我的例子中,拋出EntryPointNotFoundException的函數稱為ccn_run()。 所以我做了以下事情:
我試了一下,函數在C中工作正常,現在神奇的是當我重建bundle時(不刪除main()函數和ccn_run()調用),Unity可以調用ccn_run()函數沒有問題!
我無法解釋為什么這可以解決我的問題,但這已經為我工作了近一個月了。 不久前Xcode升級到4.3.2並且我再次嘗試了相同的方法,仍然有效。 我想也許添加一個main()函數有助於定義入口點?
最后,我記錄了將C代碼導入Unity的整個過程,我很高興在此分享: https : //docs.google.com/document/d/1vAeupNQlBTY3y3Bma5Jo_Hs4JRYm6FoEc4vQN0WBGNg/edit
我的代碼示例:
希望這個答案特別是我的教程幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.