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