私はJavaゲームを開発しており、アプリケーション(アプレットではなく)として実行されるので、完全に実行できますが、オプション( "Play"など)を備えたwindow/.exeを事前に起動するようにします。これを行う方法がわからない。
C ++ / C#ウィンドウと同じウィンドウで実行したいのですが、単独で実行できない場合は問題ありません。
私はJavaゲームを開発しており、アプリケーション(アプレットではなく)として実行されるので、完全に実行できますが、オプション( "Play"など)を備えたwindow/.exeを事前に起動するようにします。これを行う方法がわからない。
C ++ / C#ウィンドウと同じウィンドウで実行したいのですが、単独で実行できない場合は問題ありません。
基本的にはJNIを使用する必要がありますが、ネイティブコードがJVMをブートストラップするために、Javaが「ネイティブ」コードを呼び出す必要はありません。
#include <stdio.h>
#include <jni.h>
JNIEnv* create_vm() {
JavaVM* jvm;
JNIEnv* env;
JavaVMInitArgs args;
JavaVMOption options[1];
/* There is a new JNI_VERSION_1_4, but it doesn't add anything for the purposes of our example. */
args.version = JNI_VERSION_1_2;
args.nOptions = 1;
options[0].optionString = "-Djava.class.path=c:\\projects\\local\\inonit\\classes";
args.options = options;
args.ignoreUnrecognized = JNI_FALSE;
JNI_CreateJavaVM(&jvm, (void **)&env, &args);
return env;
}
void invoke_class(JNIEnv* env) {
jclass helloWorldClass;
jmethodID mainMethod;
jobjectArray applicationArgs;
jstring applicationArg0;
helloWorldClass = (*env)->FindClass(env, "example/jni/InvocationHelloWorld");
mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/String;)V");
applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/String"), NULL);
applicationArg0 = (*env)->NewStringUTF(env, "From-C-program");
(*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0);
(*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs);
}
int main(int argc, char **argv) {
JNIEnv* env = create_vm();
invoke_class( env );
}
ここで詳しく説明するように、これを行う1つの方法です。
実行可能ランチャーをビルドする以外に何もしないツールはたくさんあります。そのようなプロジェクトの1つ(経験はありません。私はJNIを直接使用しています)はJSmoothです。他の人のためにFreecode(以前のfreshmeat)などを見てください。
後者のJVMを適切に初期化するために環境のチェックをさらに行う必要があると判断した場合、およびある環境から次の環境にコマンドラインパラメーターをマーシャリングするときに実行する検証の量に大きな違いが生じます。
exe用のウィンドウが本当に必要ですか?Javaランタイムを起動するexeファイルがあれば十分ではないでしょうか。基本的に「java-jarmygame.jar」を含むbatファイルですが、exeファイルとして使用しますか?
これは非常に簡単に実装できます。Javaゲームを同じウィンドウ内で実行するのははるかに困難です。
そのsystem( "java -jar game.jar");のようなシステム関数を使用できます。