- //太能折腾了,一个下午终于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);
- }