本文共 2917 字,大约阅读时间需要 9 分钟。
//太能折腾了,一个下午终于c++可以调用java中的程序了
#include#include #include #include #include #include #ifdef _WIN32#define PATH_SEPARATOR ';'#else#define PATH_SEPARATOR ':'#endifusing namespace std;/*C字符串转JNI字符串*/ jstring stoJstring(JNIEnv* env, const char* pat) { jclass strClass = env->FindClass("Ljava/lang/String;"); jmethodID ctorID = env->GetMethodID(strClass, " ", "([BLjava/lang/String;)V"); jbyteArray bytes = env->NewByteArray(strlen(pat)); env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat); jstring encoding = env->NewStringUTF("utf-8"); jstring rstStr =(jstring) env->NewObject(strClass, ctorID, bytes, encoding); return rstStr;} /*JNI字符串转C字符串*/ char* jstringTostring(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("utf-8"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode); jsize alen = env->GetArrayLength(barr); jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = (char*)malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements(barr, ba, 0); return rtn; } int main(){ /*HMODULE JVM_DLL; JVM_DLL = ::LoadLibraryA("C:\\Program Files\\Java\\jdk1.7.0_01\\jre\\bin\\server\\jvm.dll"); if (JVM_DLL == NULL) { cout<<"无法加载连接库:jvm.dll!\n"; return 0; }*/ HINSTANCE hInstance = ::LoadLibraryA("C:\\Program Files\\Java\\jdk1.7.0_01\\jre\\bin\\server\\jvm.dll"); //HINSTANCE hInstance = ::LoadLibraryA("jvm.dll"); JavaVMOption options[1]; JNIEnv *env; JavaVM *jvm; JavaVMInitArgs vm_args; long status; jclass cls; jmethodID mid; jint square; jboolean not; jobject jobj; options[0].optionString = "-Djava.class.path=."; vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 1; vm_args.options = options; status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (status != JNI_ERR) { cls = env->FindClass("nectec/best/wordseg/ThaiSeg"); 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; }*/ jmethodID obj = env->GetMethodID(cls," ","()V"); if(obj !=0) { jobj=env->NewObject(cls,obj); std::cout << "init ok" << std::endl; } jmethodID init = env->GetMethodID( cls, "Initial","()V"); if(init !=0) { env->CallVoidMethod(jobj, init); } jmethodID token = env->GetMethodID(cls,"Token","(Ljava/lang/String;)Ljava/lang/String;"); if (token !=0) { cerr<<"start token\n"; ifstream in("data.txt"); ofstream out("result"); string line; int count = 0; while(getline(in,line)) { cerr<<++count< CallObjectMethod(jobj, token,stoJstring(env, line.c_str())); string rst = jstringTostring(env,msg); out< < DestroyJavaVM(); return 0; } else return -1; //::FreeLibrary(JVM_DLL); ::FreeLibrary(hInstance); }
转载地址:http://wbeti.baihongyu.com/