0

我正在开发一个 Java 游戏,它将作为应用程序(不是 Applet)运行,所以我想制作一个窗口/.exe 以预先启动,它有选项(例如“播放”),虽然我完全不确定如何执行此操作。

我希望它与 C++/C# 窗口在同一个窗口中运行,但如果它不能并自行运行,那很好。

4

3 回答 3

2

基本上你需要使用 JNI,但不需要 Java 调用“本机”代码,因为本机代码可以引导 JVM。

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

是一种方法,详见此处

有许多工具除了构建可执行启动器之外什么都不做。一个这样的项目(没有经验,我直接使用 JNI)是 JSmooth。看看Freecode(以前是freshmeat)之类的。

当您决定需要对环境进行更多检查以正确初始化后面的 JVM 时,以及在将命令行参数从一个环境编组到下一个环境时希望进行多少验证时,就会出现很大的不同。

于 2012-03-02T16:19:46.647 回答
1

你真的需要一个exe窗口吗?拥有一个启动 java 运行时的 exe 就足够了。本质上是一个带有“java -jar mygame.jar”的bat文件,但作为一个exe文件?

这将非常容易实现 - 让 java 游戏在同一个窗口内运行会更加困难。

于 2012-03-02T16:04:24.277 回答
0

You can use the system function like that system("java -jar game.jar");

于 2012-03-02T16:05:39.543 回答