質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

1回答

1345閲覧

Binding Libraryで配列の受け取り方

otaota

総合スコア30

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/06/20 03:26

###前提・実現したいこと
Xamarin.FormsからObjective-Cで書いたライブラリの関数を呼ぶ際、
戻り値の型がvoid, int, floatのときは問題なく使えているのですが、
今回intやfloatの配列を受け取る必要が出てきて
そのときにApiDefinitions.csの記述をどう書き換えれば良いのかわからず詰まってしまいました。アドバイスお願いします。
(javaで書いたライブラリは特に悩むこともなく配列を扱えました)

###該当のソースコード

+ (float *)makeArrayF { static float array[5]; array[0] = 2.0f; for ( int i = 1; i < 5; i++ ) { array[i] = array[i-1]*2.0f; } return array;//[2.0,4.0,8.0,16.0,32.0] } + (int *)makeArrayI { static int array[5]; for ( int i = 0; i < 5; i++ ) { array[i] = (i + 1) * 10; } return array;// [10,20,30,40,50] }

Xamarin.iOS部から上記の配列を受け取りたいと思っています。
Objective-Cの別関数の中から上記関数を読んだときに、期待した配列を返していることは確認しています。

###発生している問題・エラーメッセージ

Objective-Sharpieを使うとApiDefinitions.csの中の該当部からは以下のようになっています。

// +(float *)makeArrayF; [Static] [Export ("makeArrayF")] [Verify (MethodToProperty)] unsafe float* MakeArrayF { get; } // +(int *)makeArrayI; [Static] [Export ("makeArrayI")] [Verify (MethodToProperty)] unsafe int* MakeArrayI { get; }

http://qiita.com/tana_/items/9434eda5f26295d36c26
などの情報を頼るとにVerifyの行は削除
{get;}のところは関数にした方がいいのか迷いつつこのままと関数の両パターンを試しましたが、肝心の戻り値の型をどう書き換えればよいかがまだわかっておりません。

###試したこと
戻り値の型としてIntPtrやNSArrayを使うことでビルドだけは通るようになりました。

IntPtrとして受け取った場合は
http://kenrow.b.osdn.me/2011/11/24/intptr-%E3%81%8B%E3%82%89%E3%81%AE%E8%89%B2%E3%80%85%E3%81%AA%E5%9E%8B%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B/
を参考に配列に変換してみましたが、期待した値ではありませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
Xamarin 6.3(build 864)
Mac Note Pro
OS X Yosemite(10.10.5)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

NSObject[]はどうでしょうか?
またはint[]など具体的な型を指定したら動きませんか?

投稿2017/06/20 06:23

yamataka3

総合スコア145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otaota

2017/06/20 07:21

回答ありがとうございます。 早速試してみました。 まず、ApiDefinitions.csの中を // +(float *)makeArrayF; [Static] [Export("makeArrayF")] float[] MakeArrayF(); // +(int *)makeArrayI; [Static] [Export("makeArrayI")] int[] MakeArrayI(); とした場合は、ビルド時にXamarinTestLib.g.csというファイルの中に 次のようなコードが吐き出されるようで [Export ("makeArrayF")] [CompilerGenerated] public static float[] MakeArrayF () { return NSArray.ArrayFromHandle<float>(global::ApiDefinitions.Messaging.IntPtr_objc_msgSend (class_ptr, Selector.GetHandle ("makeArrayF"))); } [Export ("makeArrayI")] [CompilerGenerated] public static int[] MakeArrayI () { return NSArray.ArrayFromHandle<int>(global::ApiDefinitions.Messaging.IntPtr_objc_msgSend (class_ptr, Selector.GetHandle ("makeArrayI"))); } というコードが吐き出され、それぞれNSArray〜の行で The type 'float(int)' must be a reference type in order to use it as parameter 'T' in the generic type or method 'NSArray.ArrayFromHandle<T>(IntPtr)' というエラーになってしまいました。 次に両方の型をNSObject[]とした場合、ビルドは通ったのですが、(不思議なことにXamarinTestLib.g.csの内容は同じでした)いざ、 var array = XamarinTestLib.MakeArrayF(); と関数を呼んでみると、強制終了してしまいました。 一応stacktraceの上部を貼り付けておきます。 2017-06-20 16:18:49.964 XFBindTest.iOS[17294:17810888] critical: at <unknown> <0xffffffff> 2017-06-20 16:18:49.969 XFBindTest.iOS[17294:17810888] critical: at (wrapper managed-to-native) ObjCRuntime.Messaging.nuint_objc_msgSend (intptr,intptr) [0x0000a] in <58a9bd8a3cbb4d0092bc0a767ff66c0f>:0 2017-06-20 16:18:49.970 XFBindTest.iOS[17294:17810888] critical: at Foundation.NSArray.GetCount (intptr) [0x00000] in /Users/builder/data/lanes/4691/d2270eec/source/xamarin-macios/src/Foundation/NSArray.cs:201 2017-06-20 16:18:49.970 XFBindTest.iOS[17294:17810888] critical: at Foundation.NSArray.ArrayFromHandle<T_REF> (intptr) [0x00012] in /Users/builder/data/lanes/4691/d2270eec/source/xamarin-macios/src/Foundation/NSArray.cs:247 2017-06-20 16:18:49.970 XFBindTest.iOS[17294:17810888] critical: at XCLib.XamarinTestLib.MakeArrayF () [0x00001] in /Users/xxxxxxxxxxxx/Projects/zzzz/XCLib/obj/Debug/ios/XCLib/XamarinTestLib.g.cs:117
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問