-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathScannerLib.cpp
More file actions
76 lines (69 loc) · 2.45 KB
/
ScannerLib.cpp
File metadata and controls
76 lines (69 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include "Scanner.h"
#include "parser.h"
#include "com_htmlparser_jni_Scanner.h"
using namespace std;
using namespace Scannerlib;
JNIEXPORT jobject JNICALL Java_com_htmlparser_jni_Scanner_parseHTMl(JNIEnv *env,
jobject jthis, jstring data) {
//ArrayList Object
jclass cls_ArrayList = env->FindClass("java/util/ArrayList");
jmethodID construct = env->GetMethodID(cls_ArrayList, "<init>", "()V");
jobject obj_ArrayList = env->NewObject(cls_ArrayList, construct, "");
jmethodID arrayList_add = env->GetMethodID(cls_ArrayList, "add",
"(Ljava/lang/Object;)Z");
int length = (env)->GetStringLength(data);
const jchar* jcstr = (env)->GetStringChars(data, 0);
char* rtn = (char*) malloc(length * 2 + 1);
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR) jcstr, length, rtn,
(length * 2 + 1), NULL, NULL);
//token Object
jclass cls_token = env->FindClass("com/htmlparser/jni/Token");
//get field id
jfieldID token_tag = env->GetFieldID(cls_token, "tag", "I");
jfieldID token_text = env->GetFieldID(cls_token, "text",
"Ljava/lang/String;");
//none argument construct function
jmethodID construct_token = env->GetMethodID(cls_token, "<init>", "()V");
//get method id
Parser *p = new Parser();
vector<Token*> *res = p->parseHTML(rtn);
vector<Token*>::iterator iter = res->begin();
for (; iter != res->end(); iter++) {
//new a object
jobject obj_token = env->NewObject(cls_token, construct_token, "");
if (!(*iter)->_value) {
continue;
}
const char* str = (*iter)->_value;
jstring rtn = 0;
int slen = strlen((*iter)->_value);
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);
env->SetObjectField(obj_token, token_text, rtn);
env->SetIntField(obj_token, token_tag, (*iter)->_type);
env->CallObjectMethod(obj_ArrayList, arrayList_add, obj_token);
env->DeleteLocalRef(obj_token);
}
env->DeleteLocalRef(cls_token);
env->DeleteLocalRef(cls_ArrayList);
env->ReleaseStringChars(data, jcstr);
iter = res->begin();
while (iter != res->end()) {
delete *iter;
++iter;
}
res = NULL;
return obj_ArrayList;
}