C++からJNIでjavaのメソッドを呼ぶ時にC++のクラスを引数で渡したい

[戻る]
しの 2006/05/23(火) 14:40:14
こんにちは。こちらには初めて投稿させていただきます。
C++(Ver6.0)からJNIを使用してjavaのメソッドを呼び出すテストプログラムを作成してい
ます。
実際、javaのメソッドの呼び出しはできたのですが、以下のような拡張を考えています。
@引数にC++のクラスを指定してjavaのメソッドを呼び出す。
A@のjavaのメソッドの中から引数で渡したC++のクラスのメソッドを実行する。

@については、以下のようなロジックで可能なのかな?と思っています。

// VMの作成
  :
// クラスをロード。
    jlass jcTarget = env->FindClass("XXX_YYY");
  :
// 呼び出しメソッドを取得。
    jmethodID mid = env->GetMethodID(
    jcTarget, "xx_yy_1", "(Ljava/lang/Class;)V"

    CClass_1 cls_1;  //クラス生成

//javaメソッドの呼び出し
    env->CallStaticVoidMethod(jcTarget, mid, jstrNum, (jobject)cls_1);
  :

Aについては、javaの方をどのようにプログラムしてよいかわかりません。
public class XXX_YYY {
    public String xx_yy_1(CClass_1 cls_1 ) {  ←こんな指定でよいのでしょうか?
        cls_1.method1();                      ←メソッド実行
    }
}
上記のようになるのかな?とは思っていますが、CClass_1(C++のクラス)はそのまま使え
ないでしょうからどうしたらよいのかわかりません。
これについては、色々サイトを調べてみましたがどうしても該当するようなサイトがみつ
かりませんでした。

java,JNIについて勉強し始めたばかりの私ですが、どなたかご存知の方がいらっしゃい
ましたらご教授していただけないでしょうか?
また、関連サイト等教えていただければうれしいです。

よろしくお願いします。

dairygoods 2006/05/24(水) 10:50:45
Java には C++ のクラスを扱う仕組みがありませんから、
不可能でしょう。

CClass_1 という Java のクラスを作って、
引数に渡すのでは駄目なのでしょうか?

しの 2006/05/24(水) 13:08:03
dairygoodsさん、情報ありがとうございます。

>CClass_1 という Java のクラスを作って、
>引数に渡すのでは駄目なのでしょうか?
これは、Java側にCClass_1クラスを作成し、そのクラス内のメソッドをC++から呼ぶよう
にする。ということでしょうか?

dairygoods 2006/05/24(水) 13:55:19
// C++ではなくJavaのクラス
public class CClass_1
{
  pubilc method1() { ... }
};

public class XXX_YYY {
    public String xx_yy_1(CClass_1 cls_1) {
        cls_1.method1();
    }
}

C++
// VMの作成
  :
// クラスをロード。
    jlass jcTarget = env->FindClass("XXX_YYY");
  :
// 呼び出しメソッドを取得。
    jmethodID mid = env->GetMethodID(
    jcTarget, "xx_yy_1", "(Ljava/lang/Class;)V"

    // ここで Java の CClass_1 のインスタンスを生成する。

//javaメソッドの呼び出し
    env->CallStaticVoidMethod(jcTarget, mid, jstrNum, (jobject)cls_1);
  :

しの 2006/05/24(水) 16:18:57
dairygoodsさん、度々ありがとうございます。
なるほど、Javaに別のクラスを作成して、その中から別のクラスのメソッドを呼び出すの
ですね。


>// ここで Java の CClass_1 のインスタンスを生成する。
この部分については、以下のようになるのではないかと考えています。
    jclass jcWk = env->FindClass("CClass_1");
    jmethodID jmWk = env->GetMethodID(jcWk, "<init>", (Ljava/lang/String;)V);
    cls_1 = env->NewObject(jcWk, jmWk, env->NewStringUTF("Hellow");

        :

//javaメソッドの呼び出しが以下のようになる?
    env->CallStaticVoidMethod(jcTarget, mid, cls_1);


以上のような感じになるのではないかと考えていますが、まちがっていないでしょうか?
何かありましたらご指摘をお願いします。

古いスレッドには追加発言できません。