在Win64下通过jni启动jvm并运行java类:
- 环境设置:
jdk: jdk7_45(x64)
vs2010 64位命令行工具, 用来编译我们写的C++,就是这个:
环境变量设置:
- LIB变量添加“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64”, 编译时能找到64位库;
- LIB变量中添加%JAVA_HOME%\lib,主要是在编译时能找到jvm.lib库文件;
- PATH变量中添加%JAVA_HOME%\jre\bin\server,主要是为了运行编译后的exe文件能找到jvm.dll文件.
- 码代码:
java代码(待执行):
public class HelloInvocation{
public static int add(int a, int b) {
return a+b;
}
}
c++代码:
#include <jni.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif
int main(){
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint result;
options[0].optionString = "-Djava.class.path=.";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status != JNI_ERR){
cls = env->FindClass("HelloInvocation");
if (cls != 0){
mid = env->GetStaticMethodID(cls, "add", "(II)I");
if (mid != 0){
result = env->CallStaticIntMethod(cls, mid, 4, 7);
printf("Hi, 4 + 7 = %d\n", result);
}
}
jvm->DestroyJavaVM();
return 0;
} else{
return -1;
}
}
作为一个看到这里的程序员,你应该很容易理解上面的代码,我不多说;
-
拿出你的Vs2010命令行工具, 编译吧, 运行吧(编译要加入我们java jvm的库文件依赖哈):
- 执行:
- 还有些小事情,其实这里我们是借助vs2010命令行工具运行的exe文件,要是直接双击exe文件时运行不了的,应该是没有vs2010命令行工具的环境,等我后面再研究下,怎么自己来设置这些上下文,或者你知道,也可以告诉me,最后的效果图:
- 收工
来源:oschina
链接:https://my.oschina.net/u/222173/blog/182579