//太能折腾了,一个下午终于c++可以调用java中的程序了
#include <iostream> #include <jni.h> #include <Windows.h> #include <fstream> #include <iostream> #include <string> #ifdef _WIN32 #define PATH_SEPARATOR ';' #else #define PATH_SEPARATOR ':' #endif using namespace std; /*C字符串转JNI字符串*/ jstring stoJstring(JNIEnv* env, const char* pat) { jclass strClass = env->FindClass("Ljava/lang/String;"); jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([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,"<init>","()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<<endl; jstring msg =(jstring) env-> CallObjectMethod(jobj, token,stoJstring(env, line.c_str())); string rst = jstringTostring(env,msg); out<<rst<<endl; } //cout<<jstringTostring(env,msg); out.close(); in.close(); } } jvm->DestroyJavaVM(); return 0; } else return -1; //::FreeLibrary(JVM_DLL); ::FreeLibrary(hInstance); }