1、 先建立eclipse 建立JAVA工程,将工程打包成jar包。
2、 有了jar包后,在网上找了不少文章介绍如何调用,在调用过程中一个函数的参数不知如何获取,如截图中红线部分。
即方法在类中的内在描述。
我的做法是:
A、 打开cmd
B、 cd 到 java工程目录下
C、 输入指令 javacWinFile.java,此时在目录下生成WinFile.class
D、 输入javap –s WinFile,即可得到结果
3、 在load jvm.dll还遇到过不是有效的win32程序的问题,用dependswalk 打开jvm.dll也看不到其依赖文件。
最后的解决办法是卸载jdk,重新装x86版本及jre,就OK了。
4、C++调用代码:
int_tmain(intargc,_TCHAR*argv[])
{
intres;
JavaVMInitArgsvm_args;
JavaVMOptionoptions[3];
JavaVM*jvm=NULL;
JNIEnv*env=NULL;
RtlZeroMemory(&vm_args,sizeof(JavaVMInitArgs));
/*设置初始化参数*/
options[0].optionString="-Djava.compiler=NONE";//Disabled JIT
options[1].optionString="-Djava.class.path=.;Demo.jar";
options[2].optionString="-verbose:NONE";
vm_args.version=JNI_VERSION_1_8;
vm_args.nOptions=3;
vm_args.options=options;
vm_args.ignoreUnrecognized=JNI_TRUE;
// Load jvm.dll
DWORDdwErr1=GetLastError();
HINSTANCEhInstance=LoadLibrary("D:\\Program Files(x86)\\Java\\jdk1.8.0_92\\jre\\bin\\client\\jvm.dll");
DWORDdwErr=GetLastError();
if(hInstance==NULL)
returnfalse;
_CreateJavaVMm_CreateJavaVM=(_CreateJavaVM)GetProcAddress(hInstance,"JNI_CreateJavaVM");
res=(*m_CreateJavaVM)(&jvm,(void**)&env,&vm_args);
if(res<0)
return-1;
// Find the class
jclassHelloClass=env->FindClass("demo/WinFile");
// Find the main methodid
jmethodIDmid=
env->GetStaticMethodID(HelloClass,"sayHello","(Ljava/lang/String;)Ljava/lang/String;");
if(mid==0)
{
return-1;
}
std::stringstrUTF8;
std::stringstrNew="我是来自C++的string!";
jstringstrResult=(jstring)env->CallStaticObjectMethod(HelloClass,mid,env->NewStringUTF(strUTF8.c_str()));
char*pBuf=newchar[1024];
memset(pBuf,0,1024);
constchar*p=pBuf;
p=env->GetStringUTFChars(strResult,0);
env->ReleaseStringUTFChars(strResult,p);
jvm->DestroyJavaVM();
FreeLibrary(hInstance);
return0;
}
我的测试java工程(eclipse)及C++工程(VS2013)下载地址:
http://download.csdn.net/detail/xl19900502/9503378
参考博文:
http://blog.csdn.net/defonds/article/details/4932618
http://blog.itpub.net/28904215/viewspace-1250310/
http://blog.csdn.net/prog_6103/article/details/6373191