C++からJNIでjavaのメソッドを呼ぶ時にC++のクラスを引数で渡したい – プログラミング – Home

C++からJNIでjavaのメソッドを...
 
通知
すべてクリア

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


しの
 しの
(@しの)
ゲスト
結合: 20年前
投稿: 12
Topic starter  

こんにちは。こちらには初めて投稿させていただきます。
C++(Ver6.0)からJNIを使用してjavaのメソッドを呼び出すテストプログラムを作成してい
ます。
実際、javaのメソッドの呼び出しはできたのですが、以下のような拡張を考えています。
①引数にC++のクラスを指定してjavaのメソッドを呼び出す。
②①の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);
  :

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

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

よろしくお願いします。


引用解決済
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

Java には C++ のクラスを扱う仕組みがありませんから、
不可能でしょう。

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


返信引用
しの
 しの
(@しの)
ゲスト
結合: 20年前
投稿: 12
Topic starter  

dairygoodsさん、情報ありがとうございます。

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

// 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);
  :


返信引用
しの
 しの
(@しの)
ゲスト
結合: 20年前
投稿: 12
Topic starter  

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);

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました