c++调用Java以及string互转

来源:互联网 发布:ipad cellular 知乎 编辑:程序博客网 时间:2024/06/06 09:44
c++调用Java以及string互转
分类: c++ java 1652人阅读 评论(0) 收藏 举报
stringjavac++jnitokenencoding
[cpp] view plaincopy
  1. //太能折腾了,一个下午终于c++可以调用java中的程序了  
[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <jni.h>  
  3. #include <Windows.h>  
  4. #include <fstream>  
  5. #include <iostream>  
  6. #include <string>  
  7.   
  8.   
  9. #ifdef _WIN32  
  10. #define PATH_SEPARATOR ';'  
  11. #else  
  12. #define PATH_SEPARATOR ':'  
  13. #endif  
  14.   
  15. using namespace std;  
  16.   
  17. /*C字符串转JNI字符串*/   
  18. jstring stoJstring(JNIEnv* env, const char* pat)   
  19. {   
  20.     jclass strClass = env->FindClass("Ljava/lang/String;");   
  21.     jmethodID ctorID = env->GetMethodID(strClass, "<init>""([BLjava/lang/String;)V");   
  22.     jbyteArray bytes = env->NewByteArray(strlen(pat));   
  23.     env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);   
  24.     jstring encoding = env->NewStringUTF("utf-8");   
  25.     jstring rstStr =(jstring) env->NewObject(strClass, ctorID, bytes, encoding);  
  26.     return rstStr;  
  27. }   
  28.   
  29. /*JNI字符串转C字符串*/   
  30. char* jstringTostring(JNIEnv* env, jstring jstr)   
  31. {   
  32.     char* rtn = NULL;   
  33.     jclass clsstring = env->FindClass("java/lang/String");   
  34.     jstring strencode = env->NewStringUTF("utf-8");   
  35.     jmethodID mid = env->GetMethodID(clsstring, "getBytes""(Ljava/lang/String;)[B");   
  36.     jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);   
  37.     jsize alen = env->GetArrayLength(barr);   
  38.     jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);   
  39.     if (alen > 0)   
  40.     {   
  41.         rtn = (char*)malloc(alen + 1);   
  42.         memcpy(rtn, ba, alen);   
  43.         rtn[alen] = 0;   
  44.     }   
  45.     env->ReleaseByteArrayElements(barr, ba, 0);   
  46.     return rtn;   
  47. }   
  48.   
  49. int main()  
  50. {  
  51.   
  52.     /*HMODULE JVM_DLL; 
  53.     JVM_DLL = ::LoadLibraryA("C:\\Program Files\\Java\\jdk1.7.0_01\\jre\\bin\\server\\jvm.dll"); 
  54.     if (JVM_DLL == NULL)  
  55.     { 
  56.         cout<<"无法加载连接库:jvm.dll!\n"; 
  57.         return 0; 
  58.     }*/  
  59.     HINSTANCE hInstance = ::LoadLibraryA("C:\\Program Files\\Java\\jdk1.7.0_01\\jre\\bin\\server\\jvm.dll");  
  60.     //HINSTANCE hInstance = ::LoadLibraryA("jvm.dll");  
  61.   
  62.     JavaVMOption options[1];  
  63.     JNIEnv *env;  
  64.     JavaVM *jvm;  
  65.     JavaVMInitArgs vm_args;  
  66.     long status;  
  67.     jclass cls;  
  68.     jmethodID mid;  
  69.     jint square;  
  70.     jboolean not;  
  71.     jobject jobj;  
  72.   
  73.     options[0].optionString = "-Djava.class.path=.";  
  74.     vm_args.version = JNI_VERSION_1_2;  
  75.     vm_args.nOptions = 1;  
  76.     vm_args.options = options;  
  77.     status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);  
  78.     if (status != JNI_ERR)  
  79.     {  
  80.         cls = env->FindClass("nectec/best/wordseg/ThaiSeg");  
  81.         if(cls !=0)  
  82.         {   
  83.             /*mid = env->GetStaticMethodID( cls, "add", "(II)I"); 
  84.             if(mid !=0) 
  85.             {   
  86.                 square = env->CallStaticIntMethod( cls, mid, 5,5); 
  87.                 std::cout << square << std::endl; 
  88.             }*/  
  89.             jmethodID obj = env->GetMethodID(cls,"<init>","()V");  
  90.             if(obj !=0)  
  91.             {    
  92.                 jobj=env->NewObject(cls,obj);  
  93.                 std::cout << "init ok" << std::endl;  
  94.             }  
  95.             jmethodID init = env->GetMethodID( cls, "Initial","()V");  
  96.               
  97.             if(init !=0)  
  98.             {    
  99.                 env->CallVoidMethod(jobj, init);  
  100.             }  
  101.               
  102.             jmethodID token = env->GetMethodID(cls,"Token","(Ljava/lang/String;)Ljava/lang/String;");  
  103.             if (token !=0)  
  104.             {  
  105.   
  106.                 cerr<<"start token\n";  
  107.                 ifstream in("data.txt");  
  108.                 ofstream out("result");  
  109.                 string line;  
  110.                 int count = 0;  
  111.                 while(getline(in,line))  
  112.                 {  
  113.                     cerr<<++count<<endl;  
  114.                     jstring msg =(jstring) env-> CallObjectMethod(jobj, token,stoJstring(env, line.c_str()));  
  115.                     string rst = jstringTostring(env,msg);  
  116.                     out<<rst<<endl;  
  117.                 }  
  118.                   
  119.                 //cout<<jstringTostring(env,msg);  
  120.       
  121.                 out.close();  
  122.                 in.close();  
  123.   
  124.             }  
  125.               
  126.               
  127.   
  128.   
  129.         }  
  130.   
  131.   
  132.         jvm->DestroyJavaVM();  
  133.         return 0;  
  134.     }  
  135.     else  
  136.         return -1;  
  137.   
  138.     //::FreeLibrary(JVM_DLL);   
  139.     ::FreeLibrary(hInstance);   
  140.   
  141. }  
0 0
原创粉丝点击