博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++调用Java以及string互转
阅读量:4153 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
关于linux栈的一个深层次的问题
查看>>
rootkit related
查看>>
配置文件的重要性------轻化操作
查看>>
又是缓存惹的祸!!!
查看>>
为什么要实现程序指令和程序数据的分离?
查看>>
我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
查看>>
一起来看看protobuf中容易引起bug的一个细节
查看>>
无protobuf协议情况下的反序列化------貌似无解, 其实有解!
查看>>
make -n(仅列出命令, 但不会执行)用于调试makefile
查看>>
makefile中“-“符号的使用
查看>>
go语言如何从终端逐行读取数据?------用bufio包
查看>>
go的值类型和引用类型------重要的概念
查看>>
求二叉树中结点的最大值(所有结点的值都是正整数)
查看>>
用go的flag包来解析命令行参数
查看>>
来玩下go的http get
查看>>
队列和栈的本质区别
查看>>
matlab中inline的用法
查看>>
如何用matlab求函数的最值?
查看>>
Git从入门到放弃
查看>>
java8采用stream对集合的常用操作
查看>>