c++ 通过jni创建jvm比直接启动jar要卡很多?

发布于 2022-09-04 22:25:18 字数 2123 浏览 19 评论 0

我想在c++中用jni调用java程序的入口main函数,但是这样创建的jvm比直接用javaw命令运行要卡很多,但是jvm参数设置的都是一样的。在c++中运行,fps只有10-30,直接运行jar却能达到50-100。
求教这是什么原因?有什么改进的办法吗?

#include <jni.h>
using namespace std;
extern "C" {
    __declspec(dllexport) DWORD NvOptimusEnablement = 1;
}
int main() {
    JavaVMOption options[7];
    JNIEnv *env;
    JavaVM *jvm;
    JavaVMInitArgs vm_args;
    long status;
    jclass cls;
    jmethodID mid;

    options[0].optionString = "-XX:+UseG1GC";
    options[1].optionString = "-XX:-UseAdaptiveSizePolicy";
    options[2].optionString = "-XX:-OmitStackTraceInFastThrow";
    options[3].optionString = "-Xmn512m";
    options[4].optionString = "-Xmx2048m";
    options[5].optionString = "-Djava.library.path=natives";
    options[6].optionString = "-Djava.class.path=.;libraries.zip;main.jar";

    std::memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_8;
    vm_args.nOptions = 7;
    vm_args.options = options;
    cout << "start creat jvm!\n";
    status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
    if (status != JNI_ERR) {
        cout << "jvm created success\n";
        cls = env->FindClass("main/Main");
        if (cls != 0) {
            mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
            if (mid != 0) {
                jclass clz_string = env->FindClass("java/lang/String");
                if (clz_string != NULL) {
                    jobjectArray result = env->NewObjectArray(2, clz_string, NULL);
                    jstring arg0 = env->NewStringUTF("--accessToken");
                    jstring arg1 = env->NewStringUTF("14233482b8dbad97617757a5c31d5872");
                    env->SetObjectArrayElement(result, 0, arg0);
                    env->SetObjectArrayElement(result, 1, arg1);
                    env->CallStaticVoidMethod(cls, mid, result);
                }
            }
        } else {
            cout << "class not found\n";
        }
        jvm->DestroyJavaVM();
        return 0;
    } else {
        return -1;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无所的.畏惧 2022-09-11 22:25:18

已经找到原因了。直接用jni启动时,使用的是集成显卡。直接用java启动时,我设置了独立显卡,所以fps差距很大。

梓梦 2022-09-11 22:25:18

你看过jdk源码中javaw.exe的源码就知道了,它也是用JNI_CreateJavaVM实现的,所以可以对比下你的代码跟javaw.exe实现的有什么不同。

另外想到两种可能:

  1. Windows下jvm有serverclient两种类型,性能差别还是挺大的,javaw.exe会自动选择(也可以用-server-client指定),用c++调用好像要指定用哪个jvm.dll的;

  2. c++编译时用了哪个标准库(单线程还是多线程),不清楚是否会影响到jvm的调用。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文