簡體   English   中英

Monodroid,Java和C#之間的Interop

[英]Monodroid, Interop betwen Java and C#

我們在Android下有一個大的Java應用程序(“大”只意味着翻譯應用程序的工作太多了)。 我們必須訪問用.Net寫的引擎(這個引擎太“大”了......)。 這個引擎只是計算。

因此,我們尋求monodroid的解決方案。 我們的主要問題是monodroid和Java之間的互操作。 這時,我們得到:

  • 從Mono應用程序調用.jar庫中的Java函數

但我們無法調用並啟動Java活動。 可能嗎 ?

第二個問題是我們不知道如何從Java到Mono進行通信。 它也有可能嗎?

有幾種方法可以調用集成Java和托管代碼,具體取決於您想要做什么。

Java托管

如果需要調用某個托管方法, 可以使用Android Callable Wrappers ,它是為每個Java.Lang.Object子類生成的。 但是,存在許多限制 ,因此可能並不理想。

如果需要創建Activity ,可以使用Context.startActivity() ,就像在Java中一樣。 您可以查看生成的obj\\Debug\\android\\AndroidManifest.xml以確定要使用的相應類名,或者您可以使用例如ActivityAttribute.Name來手動控制Java端名稱。 (建議不要使用ActivityAttribute.Name ,因為它會減慢類型加載速度。)

Service s也是如此:使用Context.startContext()並繼續你的快樂方式。

如果您需要共享數據 ,最簡單的方法是使用ContentProvider ContentProvider通常用於跨進程數據共享,但是當您需要在Java和托管代碼之間共享數據並且您遇到Android Callable Wrappers的限制時,它們也應該在進程內可用。

管理到Java

總的來說,從C#調用Java代碼是調用C#的Java代碼的鏡像:您可以使用例如Context.StartActivity()來啟動Java活動,通過Context.ContentResolver屬性使用Java端ContentProvider等。

從托管代碼啟動Java活動的一個示例是GoogleMaps示例 ,其中Context.StartActivity()用於啟動包含的Java活動

您還可以使用Java Native Interface(JNI)支持從托管代碼創建Java實例並在這些實例上調用方法。 這是痛苦和脆弱的,但它可以工作,並允許調用未公開的API。

您可以從本機代碼輕松調用Java活動,如下所示:

var intent = new Intent().SetClassName(this,"com.myapp.java.JavaActivity");
StartActivity(intent);

我從本文中了解到,您可以通過ACW從Java調用本機代碼,但我認為這太難了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM