64,649
社区成员
发帖
与我相关
我的任务
分享
#include "cJava.h"
#include <sstream>
extern "C"
using namespace std;
namespace cJava {
ncIdentify::ncIdentify(JavaVM* myncjvm)
{
ncjvm = myncjvm;
JavaVMOption options[2];
ncenv = NULL;
JavaVMInitArgs vm_args;
long status;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.:../lib/NCnotDep.jar:../lib/CRFPP.jar";
vm_args.version = JNI_VERSION_1_2; // JDK版本号
vm_args.nOptions = 2;
vm_args.options = options;
status = JNI_CreateJavaVM(&ncjvm, (void**)&ncenv, &vm_args);
if(status!=JNI_ERR)
{
cout<<"createJVM is OK"<<endl;
}
else
{
cout<<"creatJVM is fail"<<endl;
}
nccls = ncenv->FindClass("userinterface/NCidentify");
cout<<"findClass is OK in c++"<<endl;
if(nccls !=0){
// 调用string
jmethodID mid = ncenv->GetMethodID(nccls,"<init>","()V");
ncjobj = ncenv->NewObject(nccls,mid);
jmethodID midload = ncenv->GetMethodID(nccls,"loadResource","()V");
ncenv->CallObjectMethod(ncjobj,midload);
}
}
ncIdentify::~ncIdentify()
{
ncenv->DeleteLocalRef(ncjobj);
ncenv->DeleteLocalRef(nccls);
ncjvm->DestroyJavaVM();
}
string ncIdentify::getNCresult(string query)
{
string result;
jclass strClass = ncenv->FindClass("java/lang/String");
jmethodID ctorID = ncenv->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
/*char*转jstring*/
jbyteArray bytes = ncenv->NewByteArray(strlen(query.c_str()));
ncenv->SetByteArrayRegion(bytes, 0, strlen(query.c_str()), (jbyte*)query.c_str());
jstring encoding = ncenv->NewStringUTF("gbk");//utf-8
jstring queryJstr = (jstring)ncenv->NewObject(strClass, ctorID, bytes, encoding);
ncenv->DeleteLocalRef(bytes);
jmethodID ncRegMid= ncenv->GetMethodID(nccls,"runNotDep","(Ljava/lang/String;)Ljava/lang/String;");//这里调用java里的一个函数
jstring msg = (jstring)ncenv->CallObjectMethod(ncjobj,ncRegMid,queryJstr);
/*jstring转char* */
char* rtn = NULL;
jmethodID mid = ncenv->GetMethodID(strClass, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr =(jbyteArray)ncenv->CallObjectMethod(msg,mid,encoding);
jsize alen =(jsize)ncenv->GetArrayLength(barr);
jbyte* ba = ncenv->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0){
rtn = (char*)malloc(alen+1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
result = rtn;
free(rtn);
}
ncenv->ReleaseByteArrayElements(barr, ba, 0);
ncenv->DeleteLocalRef(encoding);
ncenv->DeleteLocalRef(strClass);
ncenv->DeleteLocalRef(msg);
ncenv->DeleteLocalRef(queryJstr);
return result;
}
}
int main()
{
ifstream reader;
ofstream writer;
string query = "";
string result = "";
char* javaClassPath = "-Djava.class.path=.:../lib/NCnotDep.jar:../lib/CRFPP.jar";
JavaVM* jvm;
cJava::ncIdentify *myiden = new cJava::ncIdentify(jvm);
string fileInName = "/users/testcJava/0-20";
string fileOutName = "/users/testcJava/answer";
string buffer;
reader.open(fileInName.c_str());
writer.open(fileOutName.c_str());
while(getline(reader,query))
{
if(query!="")
{
result = myiden->getNCresult(query);
writer<<result;
writer<<"\n";
}
else
{
writer<<"\n";
}
}
reader.close();
reader.clear();
writer.close();
writer.clear();
delete myiden;
}
#include "cJava.h"
#include <sstream>
extern "C"
using namespace std;
namespace cJava {
//初始化java虚拟机
ncIdentify::ncIdentify(JavaVM* myncjvm)
{
ncjvm = myncjvm;
JavaVMOption options[2];
ncenv = NULL;
JavaVMInitArgs vm_args;
long status;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.:../lib/NCnotDep.jar:../lib/CRFPP.jar";
vm_args.version = JNI_VERSION_1_2; // JDK版本号
vm_args.nOptions = 2;
vm_args.options = options;
status = JNI_CreateJavaVM(&ncjvm, (void**)&ncenv, &vm_args);
if(status!=JNI_ERR)
{
cout<<"createJVM is OK"<<endl;
}
else
{
cout<<"creatJVM is fail"<<endl;
}
nccls = ncenv->FindClass("userinterface/NCidentify");//找到java的NCidentify这个类
cout<<"findClass is OK in c++"<<endl;
if(nccls !=0){
// 调用string
jmethodID mid = ncenv->GetMethodID(nccls,"<init>","()V");//调用NCidentify的构造函数
ncjobj = ncenv->NewObject(nccls,mid);
jmethodID midload = ncenv->GetMethodID(nccls,"loadResource","()V");//载入相关资源
ncenv->CallObjectMethod(ncjobj,midload);
}
}
ncIdentify::~ncIdentify()
{
ncenv->DeleteLocalRef(ncjobj);//回收资源
ncenv->DeleteLocalRef(nccls);
ncjvm->DestroyJavaVM();//销毁jvm
}
//这是要用到的主体函数了
string ncIdentify::getNCresult(string query)
{
string result;
jclass strClass = ncenv->FindClass("java/lang/String");
jmethodID ctorID = ncenv->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
/*char*转jstring,把gbk编码的字符串转化成jstring,以便java函数调用*/
jbyteArray bytes = ncenv->NewByteArray(strlen(query.c_str()));
ncenv->SetByteArrayRegion(bytes, 0, strlen(query.c_str()), (jbyte*)query.c_str());
jstring encoding = ncenv->NewStringUTF("gbk");//gbk编码
jstring queryJstr = (jstring)ncenv->NewObject(strClass, ctorID, bytes, encoding);//得到jstring
ncenv->DeleteLocalRef(bytes);
jmethodID ncRegMid= ncenv->GetMethodID(nccls,"runNotDep","(Ljava/lang/String;)Ljava/lang/String;");//这里调用java里的一个函数
/*实际上这样理解java的方法就行,输入是string,处理后得到string
反映到这里就是输入一个jstring,得到一个jstring*/
jstring msg = (jstring)ncenv->CallObjectMethod(ncjobj,ncRegMid,queryJstr);
/*jstring转char* ,这段代码我是在网上找的,我理解是先得到字节数组,再把字节数组转化成字符串*/
char* rtn = NULL;
jmethodID mid = ncenv->GetMethodID(strClass, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr =(jbyteArray)ncenv->CallObjectMethod(msg,mid,encoding);
jsize alen =(jsize)ncenv->GetArrayLength(barr);
jbyte* ba = ncenv->GetByteArrayElements(barr,JNI_FALSE);
if(alen > 0){
rtn = (char*)malloc(alen+1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
result = rtn;
free(rtn);
}
ncenv->ReleaseByteArrayElements(barr, ba, 0);//释放字节数组
ncenv->DeleteLocalRef(encoding);//开始释放localref
ncenv->DeleteLocalRef(strClass);
ncenv->DeleteLocalRef(msg);
ncenv->DeleteLocalRef(queryJstr);
return result;
}
}
int main()
{
ifstream reader;
ofstream writer;
string query = "";
string result = "";
char* javaClassPath = "-Djava.class.path=.:../lib/NCnotDep.jar:../lib/CRFPP.jar";
JavaVM* jvm;
cJava::ncIdentify *myiden = new cJava::ncIdentify(jvm);
string fileInName = "/users/testcJava/0-20";//读入一个很大的文本文件,每行存着一个待处理的字符串
string fileOutName = "/users/testcJava/answer";//将处理好的字符串写入这个文件
string buffer;
reader.open(fileInName.c_str());
writer.open(fileOutName.c_str());
while(getline(reader,query))
{
if(query!="")
{
result = myiden->getNCresult(query);//主要就是在调用这个方法了
writer<<result;
writer<<"\n";
}
else
{
writer<<"\n";
}
}
reader.close();
reader.clear();
writer.close();
writer.clear();
delete myiden;
}