2014-09-03 148 views
1

我正在使用Xamarin,需要通過調用兩個靜態Java方法,我已經鏈接到一個罐子裏。這裏是jar中的java類:如何將C#對象傳遞給Xamarin中的JNI方法?

package com.test; 

public class Car { 
    public static Car makeCar(String name); 
    public void drawCar(ImageView imageview); 
} 

我不知道如何將這兩個方法的參數傳遞給JNI代碼。該JNIEnv.Call **()的方法類負責參數JValue []數組,我想用它來包裝一個C#字符串,並將其命名爲所有像這樣:

// C# 

string carName = "mustang"; 

JValue[] paramCarName = new JValue[] { 
    new JValue(JNIEnv.NewString(carName)) 
}; 

IntPtr theClass = JNIEnv.FindClass("com.test.Car"); 
IntPtr theMethod = JNIEnv.GetMethodID(theClass, 
    "makeCar", "()Ljava/lang/String;"); 
IntPtr resultCar = JNIEnv.CallStaticObjectMethod(
    theClass, theMethod, paramCarName); 

那是正確的用法?我在與調用第二個方法,它指的是Android的ImageView的一個C#版本的同一問題:

// C# 

// Xamarin provides an ImageView wrapper class. 
ImageView imageview = ...; 

// Is it alright to use JNIEnv.ToJniHandle here to reference the imageview? 
JValue[] paramCarName = new JValue[] { 
    new JValue (JNIEnv.ToJniHandle (imageview)) 
}; 

... 

以上目前編譯好,但我不能運行它,因爲我只有免費版。任何有關這方面的信息都會很好,因爲我確信我在濫用這個信息。

感謝

+0

你是什麼意思的「罐子我已經鏈接到」。您是否經歷了創建Java綁定庫的過程,以便在您嘗試調用的Java代碼周圍添加C#包裝器? – jensendp 2014-09-05 18:03:44

+0

不,我試圖避免Java綁定庫。我嘗試使用Xamarin工作室,它導致了很多錯誤(這是一個比我的例子更大的jar)。我希望我可以在應用程序發行版中包含jar,只需通過JNI調用我需要的兩個方法,而不必創建Java綁定庫。 – user291701 2014-09-05 23:41:48

回答

0

如果你有麻煩廣口瓶中,綁定你可以用變換/ metadata.xml中(文檔here)修復錯誤。使用該文件,您可以禁止導致代碼生成問題的類或整個包的綁定。

如果Metadata.xml無法完成工作,另一個(較不理想的)選項是創建自己的Java庫,它封裝了不會綁定的Java庫,並且只公開您需要從C#訪問的方法。然後綁定那個罐子。

但是,這聽起來像你有Xamarin(也許就是爲什麼你要設法避免罐子結合,因爲需要付費版),所以我會嘗試修復您的JNI代碼的免費版本:

// C# 

IntPtr classHandle; 
IntPtr theClass = JNIEnv.FindClass("com/test/Car", classHandle); 
IntPtr theMethod = JNIEnv.GetMethodID(theClass, 
    "makeCar", "(Ljava/lang/String;)V"); 
// Just create a new JValue with your C# Android object peer 
JNIEnv.CallStaticObjectMethod(classRef, methodRef, new JValue[] { 
     new JValue(imageView) 
    }); 

我的JNI不是超級先進的,所以拿一些鹽做上面的。但根據Xamarin Studio爲jar綁定生成的代碼,上面應該(接近)正確。

+0

嗨佈雷特,感謝您的信息 - 是的,我更新到試用版的Xamarin工作室,並最終可以編譯和運行此代碼。除了我嘗試將C#ImageView對象作爲JValue傳遞的方法之外,現在一切正在運行。該應用只會與(SIGABRT)崩潰。你有任何關於將C#同行視圖傳遞給JNI土地的文檔嗎?謝謝 – user291701 2014-09-07 17:08:27

+0

它看起來像'CallStaticObjectMethod'接受一個可能是問題的JValues數組。我會用正確的電話更新我的答案。 – 2014-09-08 22:16:46

+0

嘿佈雷特,對不起,我一直在使用JValue []數組,像你在更新的答案,這仍然導致崩潰。我不太確定Xamarin如何將它的ImageView版本以dalvik的形式公開爲ImageView的概念。如果兩者甚至可以通過JNI以這種方式兼容?我一直在尋找一個試圖通過JNI將視圖從Xamarin傳遞給jar的例子,但是沒有發現任何東西。你看過Xamarin團隊的這個話題的任何文檔嗎? – user291701 2014-09-09 00:22:29

相關問題