java - c++ 通過jni創(chuàng)建jvm比直接啟動jar要卡很多?
問題描述
我想在c++中用jni調(diào)用java程序的入口main函數(shù),但是這樣創(chuàng)建的jvm比直接用javaw命令運行要卡很多,但是jvm參數(shù)設(shè)置的都是一樣的。在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 successn';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 foundn';}jvm->DestroyJavaVM();return 0; } else {return -1; }}
問題解答
回答1:你看過jdk源碼中javaw.exe的源碼就知道了,它也是用JNI_CreateJavaVM實現(xiàn)的,所以可以對比下你的代碼跟javaw.exe實現(xiàn)的有什么不同。
另外想到兩種可能:
Windows下jvm有server和client兩種類型,性能差別還是挺大的,javaw.exe會自動選擇(也可以用-server或-client指定),用c++調(diào)用好像要指定用哪個jvm.dll的;
c++編譯時用了哪個標(biāo)準(zhǔn)庫(單線程還是多線程),不清楚是否會影響到j(luò)vm的調(diào)用。
相關(guān)文章:
1. android - Genymotion 微信閃退 not find plugin.location_google.GoogleProxyUI2. mac里的docker如何命令行開啟呢?3. android webview返回自動刷新4. objective-c - iOS開發(fā)使用什么對html進行代碼高亮5. angular.js - 關(guān)于ng-model和ng-bind的疑問6. html - 特殊樣式按鈕 點擊按下去要有凹下和彈起的效果7. angular.js - 在ionic下,利用javascript導(dǎo)入百度地圖,pc端可以顯示,移動端無法顯示8. javascript - 單個控件多個字段搜索9. javascript - npm安裝報錯 系統(tǒng)w7 求大神解答10. html5 - 微信瀏覽器視頻播放失敗
