Skip to content

Commit 31f4f99

Browse files
committed
chore(jni): add jni-util.h
1 parent 98819db commit 31f4f99

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#ifndef TRIME_JNI_UTILS_H
2+
#define TRIME_JNI_UTILS_H
3+
4+
#include <jni.h>
5+
#include <string>
6+
7+
class JString {
8+
private:
9+
JNIEnv *env_;
10+
jstring jstring_;
11+
12+
public:
13+
JString(JNIEnv *env, const char *chars)
14+
: env_(env), jstring_(env->NewStringUTF(chars)) {}
15+
16+
JString(JNIEnv *env, const std::string &string)
17+
: JString(env, string.c_str()) {}
18+
19+
~JString() {
20+
env_->DeleteLocalRef(jstring_);
21+
}
22+
23+
operator jstring() { return jstring_; }
24+
25+
jstring operator*() { return jstring_; }
26+
};
27+
28+
class JClass {
29+
private:
30+
JNIEnv *env_;
31+
jclass jclass_;
32+
33+
public:
34+
JClass(JNIEnv *env, const char *name)
35+
: env_(env), jclass_(env->FindClass(name)) {}
36+
37+
~JClass() {
38+
env_->DeleteLocalRef(jclass_);
39+
}
40+
41+
operator jclass() { return jclass_; }
42+
43+
jclass operator*() { return jclass_; }
44+
};
45+
46+
class JEnv {
47+
private:
48+
JNIEnv *env;
49+
50+
public:
51+
JEnv(JavaVM *jvm) {
52+
if (jvm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) == JNI_EDETACHED) {
53+
jvm->AttachCurrentThread(&env, nullptr);
54+
}
55+
}
56+
57+
operator JNIEnv *() { return env; }
58+
59+
JNIEnv *operator->() { return env; }
60+
};
61+
62+
class GlobalRefSingleton {
63+
public:
64+
JavaVM *jvm;
65+
66+
jclass Object;
67+
68+
jclass String;
69+
70+
jclass Integer;
71+
jmethodID IntegerInit;
72+
73+
jclass Boolean;
74+
jmethodID BooleanInit;
75+
76+
jclass ArrayList;
77+
jmethodID ArrayListInit;
78+
jmethodID ArrayListAdd;
79+
80+
jclass HashMap;
81+
jmethodID HashMapInit;
82+
jmethodID HashMapPut;
83+
84+
GlobalRefSingleton(JavaVM *jvm_) : jvm(jvm_) {
85+
JNIEnv *env;
86+
jvm->AttachCurrentThread(&env, nullptr);
87+
88+
Object = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/lang/Object")));
89+
90+
String = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/lang/String")));
91+
92+
Integer = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/lang/Integer")));
93+
IntegerInit = env->GetMethodID(Integer, "<init>", "(I)V");
94+
95+
Boolean = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/lang/Boolean")));
96+
BooleanInit = env->GetMethodID(Boolean, "<init>", "(Z)V");
97+
98+
ArrayList = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
99+
ArrayListInit = env->GetMethodID(ArrayList, "<init>", "()V");
100+
ArrayListAdd = env->GetMethodID(ArrayList, "add", "(ILjava/lang/Object;)V");
101+
102+
HashMap = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/HashMap")));
103+
HashMapInit = env->GetMethodID(HashMap, "<init>", "()V");
104+
HashMapPut = env->GetMethodID(HashMap, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
105+
}
106+
107+
const JEnv AttachEnv() const { return JEnv(jvm); }
108+
};
109+
110+
#endif //TRIME_JNI_UTILS_H

0 commit comments

Comments
 (0)