Maison  >  Questions et réponses  >  le corps du texte

java - C++ Créer JVM via JNI est beaucoup plus bloqué que démarrer Jar directement?

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 <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;
    }
}
巴扎黑巴扎黑2736 Il y a quelques jours776

répondre à tous(1)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:23:53

    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 de JNI_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 : serveur et client La différence de performances est assez grande javaw.exe sélectionnera automatiquement (. vous pouvez également utiliser -server ou -client pour 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 ?
      🎜 🎜

      répondre
      0
  • Annulerrépondre