参考了http://www.iteye.com/topic/460152
几乎是照着例子做的,遇到以下困难
1
error LNK2001: unresolved external symbol __imp__JNI_CreateJavaVM@12
这是因为没有连接到 JVM.lib 库导致的. 一开始使用工具DEV C++,但它在windows 下无完连接.lib 库,改用VC++ 解决了问题(工程-设置-连接)。
2 JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 创建不了。这里和之前Java使用DLL 不同,jvm.dll 并不单放在 windows/system32 下面就可以解决,它有依赖,需设置环境变量 paht jdk1.6.0_12\jre\bin\server.
3 java类存放位置放在 options[0].optionString = "-Djava.class.path=."; 指定的地方.这里是指定为当前项目目录.
相关代码:
#include <stdio.h> #include <tchar.h> #include <iostream> #include <jni.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 square; //设置Java类的路径 options[0].optionString = "-Djava.class.path=."; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status != JNI_ERR) { cls = env->FindClass("com/isw2/jni/CJava"); if(cls !=0) { mid = env->GetStaticMethodID( cls, "add", "(II)I"); if(mid !=0) { square = env->CallStaticIntMethod( cls, mid, 5,5); std::cout << square << std::endl; printf("square : %d",square); } } jvm->DestroyJavaVM(); return 0; } else{ return -1;} }
package com.isw2.jni; public class CJava { public static String getstring(String str) { return str + "----String com.isw2.jni.CJava.getstring(String str) "; } public static int add(int a, int b) { return a + b; } }