Create a new dynamic library project named zzutils in Code::Blocks.
First, copy header file org_zerozone_util_Utils.h into project directory, and add this header file into project, then create a new CPP file named utils.cpp, the contents of which are listed below:
#include <windows.h>
#include "org_zerozone_utils_Utils.h"
#include "cn_net_ynst_kjjl_util_Utils.h"
#include <vole/vole.hpp>
#include <comstl/util/initialisers.hpp>
using vole::object;
using vole::collection;
char* jstringToWindows(JNIEnv *env, jstring jstr)
{
int length = env->GetStringLength(jstr);
const jchar* jcstr = env->GetStringChars(jstr, 0);
char* rtn = (char*)malloc(length*2+1);
int size = 0;
size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length,
rtn,(length*2+1), NULL, NULL);
if(size <= 0)
{
free(rtn);
rtn = NULL;
return NULL;
}
env->ReleaseStringChars(jstr, jcstr);
rtn[size] = 0;
return rtn;
}
jstring windowsToJstring(JNIEnv* env, char* str)
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short* buffer = 0;
if(slen == 0)
{
rtn = env->NewStringUTF(str);
}
else
{
int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str, slen, NULL, 0);
buffer = (unsigned short*)malloc(length*2 + 1);
if( MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str,
slen, (LPWSTR)buffer, length ) > 0)
rtn = env->NewString((jchar*)buffer, length);
}
if(buffer)
{
free(buffer);
buffer = NULL;
}
return rtn;
}
}
JNIEXPORT void JNICALL Java_cn_net_ynst_kjjl_util_Utils_generateWordDocument
(JNIEnv *env, jclass clazz, jstring fileName, jobjectArray bookmarkNames,
jint bookmarkCount, jobjectArray values, jint valueCount)
{
if(bookmarkCount != valueCount)
return;
int len = 0;
char* _fileName = jstringToWindows(env, fileName);
len = MultiByteToWideChar(CP_ACP, 0,
(LPCSTR)_fileName, strlen(_fileName) + 1, NULL, 0);
wchar_t* _w_fileName = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)_fileName, -1, _w_fileName, len);
comstl::com_init init;
object word = object::create("Word.Application", CLSCTX_LOCAL_SERVER,
vole::coercion_level::naturalPromotion);
word.put_property(L"Visible", false);
collection documents = word.get_property<collection>(L"Documents");
object document = documents.invoke_method<object>
(L"Open", (LPCWSTR)_w_fileName);
collection bookmarks = document.get_property<collection>(L"Bookmarks");
int count = bookmarks.get_property<int>(L"Count");
for(int i = 1; i <= count; i++)
{
object bookmark = bookmarks.invoke_method<object>(L"Item", i);
std::string name = bookmark.get_property<std::string>(L"Name");
for(int j = 0; j < bookmarkCount; j++)
{
jstring bookmarkName =
(jstring)env->GetObjectArrayElement(bookmarkNames, j);
const char* _bookmarkName = env->GetStringUTFChars(bookmarkName, 0);
if(strcmp(name.c_str(), _bookmarkName) == 0)
{
jstring value = (jstring)env->GetObjectArrayElement(values, j);
char* _value = jstringToWindows(env, value);
len = MultiByteToWideChar(CP_ACP, 0,
(LPCSTR)_value, strlen(_value) + 1, NULL, 0);
wchar_t* _w_value = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)_value, -1, _w_value, len);
object range = bookmark.get_property<object>(L"Range");
range.invoke_method_v(L"InsertAfter", (LPCWSTR)_w_value);
free(_value);
free(_w_value);
_value = NULL;
_w_value = NULL;
env->ReleaseStringUTFChars(bookmarkName, _bookmarkName);
break;
}
env->ReleaseStringUTFChars(bookmarkName, _bookmarkName);
}
}
document.invoke_method_v(L"Save");
document.invoke_method_v(L"Close", false);
word.invoke_method_v(L"Quit");
free(_fileName);
free(_w_fileName);
}