java - C++ Créer JVM via JNI est beaucoup plus bloqué que démarrer Jar directement?
巴扎黑
巴扎黑 2017-05-16 13:21:53
0
1
690

Je souhaite utiliser jni pour appeler la fonction principale d'entrée du programme java en c++, mais le jvm créé de cette manière est beaucoup plus bloqué que de l'exécuter directement avec la commande javaw, mais les paramètres jvm sont les mêmes. Lors de l'exécution en C++, le fps n'est que de 10 à 30, mais lors de l'exécution directe du pot, il peut atteindre 50 à 100.
S'il vous plaît, dites-moi quelle en est la raison ? Existe-t-il des moyens d'améliorer cela ?

#include  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; } }
巴扎黑
巴扎黑

répondre à tous (1)
伊谢尔伦

Vous saurez si vous avez vu le code source de javaw.exe dans le code source du jdk. Il est également implémenté à l'aide deJNI_CreateJavaVM, afin que vous puissiez comparer la différence entre votre code et javaw.exe.JNI_CreateJavaVM实现的,所以可以对比下你的代码跟javaw.exe实现的有什么不同。

另外想到两种可能:

  1. Windows下jvm有serverclient两种类型,性能差别还是挺大的,javaw.exe会自动选择(也可以用-server-client

    Deux autres possibilités me viennent à l'esprit :
    1. Il existe deux types de jvm sous Windows :serveuretclientLa différence de performances est assez grandejavaw.exesélectionnera automatiquement (. vous pouvez également utiliser-serverou-clientpour spécifier). Lors de l'appel avec c++, il semble que vous deviez spécifier quel jvm.dll utiliser ;

    2. Quelle bibliothèque standard (monothread ou multithread) est utilisée lors de la compilation de C++ ? On ne sait pas si cela affectera l'appel de jvm ?
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!