• 締切済み

android-JNIでクラス配列参照方法について

androidのJNIで関数引数をクラス配列にした場合、C側ではこのポインタをどのようにすれば取得出来るのでしょうか? 一応GetByteArrayElements()を使用してクラス配列の要素数までは取得できましたが、このクラスのポインタの取得方法が出来ません。 ※クラス配列にある変数をC言語側で参照したいと考えております。 (このクラスはC言語の構造体として扱うようにしています)

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

GetByteArrayElements()とか「クラス配列にある変数」というのがやろうとしていることとどういう関係にあるのか、質問文にある内容だけでは分かりません。 クラスの配列を引数に取るJNIメソッドの例です。 Java側でClass[]型になっている引数はCではjobjectArrayになります。GetObjectArrayElement()で配列から取り出した値をjclassにキャストします。GetMethodID()でメソッドを取得できることが分かると思います。 〔Java〕 public static native void f(Class[] array); 〔C〕 JNIEXPORT void JNICALL Java_qa8053591_f(JNIEnv *env, jclass cls, jobjectArray array) { int i; int n=(*env)->GetArrayLength(env, array); printf("Array size=%d\n", n); for (i=0; i<n; i++) { jclass obj=(jclass)((*env)->GetObjectArrayElement(env, array, i)); jmethodID meth=(*env)->GetMethodID(env, obj, "toString", "()Ljava/lang/String;"); printf("elem[%d]=%p, toString()=%p\n", i, obj, meth); } }

関連するQ&A

  • 配列の受け渡しについて

    ある関数で、引数としてやりとりするデータが多いため、構造体にまとめて受け渡しするようにしています。 その構造体のメンバにポインタ変数を設け、2次元配列のポインタを受け渡しするようにしたいのですが、受け取った側でそのポインタを"2次元の配列"として扱うことができずに困っております。(2次元であることが認識できない?) 配列そのものを受け渡しする方法以外で、これを解決する手段はないでしょうか? (ANSI-Cです)

  • 関数へのポインタ渡しでの配列の初期化について

    はじめまして、C言語の基本的な質問をさせてください。 C言語で、外部関数へポインタで引数を渡す場合に、 関数に渡されるのはアドレスですよね? で、渡された関数側でそのポインタの配列の初期化を するときにはアドレスだけの情報だと、要素数がいくつ あるか分からず、領域の破壊をしてしまいそうな気が するのですが?いかがでしょうか? また、関数かなんかで、配列の要素数が分かる関数が あったような気がするのですが、それもアドレスだけ でわかるのでしょうか?

  • 多次元配列のポインタ渡し

    C++を使用しています。 多次元配列を関数の引数として渡したいとき、関数側では void A::Func(int a[10][20][30])~ 呼びだし側では Finc(a); とやればいいのはわかります。 お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。 aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、 この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。 (メンバ変数のポインタは配列じゃないから当然ですよね) これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。

  • 関数のパラメータに配列を渡すときは、非参照型が普通なんですか?

     LippmanのC++プライマー(第4版)を勉強中です。 p.274以降に、配列に作用する関数の定義法と使用法に関する解説があり、p.275に以下の記述があります。 ■配列アーギュメント  配列パラメータも参照型と非参照型がある。  普通、配列は非参照型にする  非参照型パラメータは対応するアーギュメントのコピーで初期化される。配列アーギュメントはその配列の先頭要素へのポインタであり、そのポインタがパラメータにコピーされる。関数はアーギュメントのポインタを変更することはないが、パラメータのポインタを使って配列要素を変更することはできる。 ■配列を参照で渡すこと  配列パラメータを配列への参照にすることもできる。パラメータが配列への参照である場合、コンパイラは配列アーギュメントをポインタに変換しない。配列への参照そのものを渡す。この場合、配列の大きさはパラメータの型の一部である。コンパイラは配列アーギュメントの大きさがパラメータの大きさに一致するかどうかチェックする。 しかしp.268の「ヒント」には以下のように記されています。 ヒント:  Cの素養があるC++プログラマはアーギュメントにアクセスするためにポインタを渡すことに慣れている。 C++では、参照パラメータを使うのが安全かつ自然である。  配列パラメータも参照で渡したほうが、ポインタをコピーしないですむし、配列の大きさを越えてアクセスすることによる実行時エラーも抑止できるので、いいように思いますが、なんで「普通、配列は非参照型にする」んでしょうか?

  • 構造体配列のポインタを引数に

    こんばんは。 Visual C++ 2008 Express Edition を使っています。 C++のあるプログラム内の関数で、構造体の1次元配列のポインタを引数に取ろうと思っているのですが上手くいきません。 関数の目的としては、関数側と呼び出す側のファイルを分けているので、関数側のグローバルな構造体配列のアドレスに呼び出し側の構造体配列のアドレスを代入することです。 構造体はExampleと型を定義してあります。 ・関数側 Example *global_ex[10]; void GetEx(Example *ex[])  // ←2つ目のエラー {   global_ex = ex;  // ←1つ目のエラー } ・呼び出し側(呼び出し側の関数内)   Example ex[10];   (exの初期化)   GetEx(&ex); ・エラー  error C2440: '=' : 'Example *[]' から 'Example [15]' に変換できません。配列型への変換はありませんが、参照またはポインタから配列への変換があります。  error C2664: 'GetEx' : 1 番目の引数を 'Example (*)[15]' から 'Example *[]' に変換できません。 プログラムとエラーは以上です。 何をすれば解決できるのか、ご存じの方いらっしゃいましたらよろしくおねがいします。 CとC++は独学で学んでいるので偏りがあると思います。 「基本的な○○が分かっていないのでは?」と感じたらその点もご指摘頂けると嬉しいです。。

  • JNIについて

    JNI入門者なのですが、 少しJNIをやってみて、自分の中で発生した疑問について聞きたいです。 知りたいのが、 JNIはC/C++の利用で、FieldID、MethodID等で、ポインタ的なアプローチをしていますが、 高速である事意外に、javaのリフレクションと何が違うのか?という事です。 結局FindClassも、インスタンス化されていなければ、*env->NewObject(env,~とやって、 インスタンス化してあげないと、もし呼び出し元で参照されないところでnewされていたとしても、 そのクラスのインスタンスのインスタンスメソッドは呼べない、という事でいいのか? というところです。 WEB上で調べていると、情報が少なく、中にはあたかも、パッケージ名がわかれば、自由にVM内のインスタンスにアクセスできるような記載もあるので、よくわかりません。

  • 配列のポインタ配列のポインタから元の配列を参照する方法について

    C初心者です。下記の様に配列のポインタ配列を作って、そのポインタ配列のポインタを返すコードを書いて、main関数で元の配列の値を参照したいのですが、上手く参照できずに困っています。下記のコードの問題点も含めて、配列のポインタ配列のポインタから、元の配列の値を参照する方法を教えてください。お願い致します。 short int *motion_data(void) { short int data1[5][7] = { {2377,2174,0,0,0,0,0}, {2377,2377,2784,2648,2648,2648,2377}, {2377,2377,2784,2648,2648,2648,2377}, {2377,2377,2377,2377,2377,0,0}, {2377,2377,2377,2377,2377,0,0}, }; short int data2[5][7] = { {2377,2174,0,0,0,0,0}, {2377,2377,2919,2784,2784,2784,2377}, {2377,2377,2919,2784,2784,2784,2377}, {2377,2377,2377,2377,2377,0,0}, {2377,2377,2377,2377,2377,0,0}, }; short int *po_data[2]; po_data[0] = data1[0]; po_data[1] = data2[0]; return *po_data; }

  • 配列の要素数を超えた参照のコンパイル

    C言語においては”配列の要素数を超えての参照もコンパイルエラーにはならない”という事がいえます。 例えば int a[10]={1}; とした時、a[-1] a[11]を参照しても、コンパイルエラーにはなりません。不定値が表示されるか、Red Hat Linuxに関しては”セグメンテーション違反です”とでるだけです。 しかし、わたしはCしか学んではいませんので解りませんが、配列の要素数を超えての参照はコンパイルエラーになる言語もあるのではないかと思います。 C言語はよく”暴走する言語”と言われます。規制をできる限り排除して軽くし、ミスはプログラマが取るという意味に考えています。 ”C言語においては配列の要素数を超えての参照もコンパイルエラーにはならないという事”はC言語のその様な設計思想に基ずいた仕様なのでしょうか。 それとも、違う考えに基ずいて、”配列の要素数を超えての参照もコンパイルエラーにはならない”という事に成っているのでしょうか。 宜しく願います。

  • 配列とその要素数をメンバにもつ構造体

    C言語では,配列を引数とするときに,合わせて要素数を渡さなければいけないといわれます. そこで,配列とその要素数をメンバにもつ構造体を定義して,これを要素数つき配列のように扱えば,引数として渡す場合には,この構造体を渡すだけでよいと思うのですが,このような用法は一般的に用いられているでしょうか. 単純なアイデアだと思うんですが,あまり紹介されているのを見たことがありません. もしあまり用られない用法であれば,その理由を教えてください. 現在,プログラムを書いているのですが,引数の多さに閉口しており,上の考えで,引数を減らしたいと考えています.  よろしくお願いいたします.

  • PHPにてクラスを配列にすることは可能でしょうか。

    PHPにてクラスを配列にすることは可能でしょうか。 環境はPHP5です。 現在下記のようなクラスを作成しました。 class Ary_c { var $v1; // コンストラクタ function Ary_c() { $this->v1 = "test"; } } このクラスをC++言語などで出来るような、 クラスの配列として扱いたいのです。 C++だとたとえば10個の要素があるクラスの配列は Ary_c t[ 10 ]; みたいな感じで宣言できます。 こういったことをPHPでやることは可能でしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう