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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#include <jni.h>
#include <memory>
#include <stdexcept>
#include <vector>
#include "helper.h"
jfieldID getInstanceField(JNIEnv *env, jobject obj)
{
jclass clazz = env->GetObjectClass(obj);
// J == long
return env->GetFieldID(clazz, "nativeInstance", "J");
}
jclass search_class(JNIEnv *env, const char *clazz_name)
{
jclass clazz = env->FindClass(clazz_name);
if (clazz == NULL)
{
throw std::runtime_error("no class found\n");
}
return clazz;
}
jmethodID search_method(JNIEnv *env, jclass clazz, const char *method_name,
const char *prototype, bool is_static)
{
jmethodID method;
if(is_static)
{
method = env->GetStaticMethodID(clazz, method_name, prototype);
}
else
{
method = env->GetMethodID(clazz, method_name, prototype);
}
if(method == NULL)
{
throw std::runtime_error("no method found\n");
}
return method;
}
jfieldID search_field(JNIEnv *env, jclass clazz, const char *field_name,
const char *type, bool is_static)
{
jfieldID field;
if(is_static)
{
field = env->GetStaticFieldID(clazz, field_name, type);
}
else
{
field = env->GetFieldID(clazz, field_name, type);
}
if(field == NULL)
{
throw std::runtime_error("no method found\n");
}
return field;
}
bool from_jboolean_to_bool(jboolean val)
{
bool result;
if (val == JNI_TRUE)
{
result = true;
}
else
{
if (val == JNI_FALSE)
{
result = false;
}
else
{
throw std::invalid_argument("the jboolean value is not true/false\n");
}
}
return result;
}
jobject get_bluetooth_type(JNIEnv *env, const char *field_name)
{
jclass b_type_enum = search_class(env, "BluetoothType");
jfieldID b_type_field = search_field(env, b_type_enum, field_name, "l", true);
jobject result = env->GetStaticObjectField(b_type_enum, b_type_field);
return result;
}
jobject get_new_arraylist(JNIEnv *env, unsigned int size, jmethodID *add)
{
jclass arraylist_class = search_class(env, "Ljava/util/ArrayList;");
jmethodID arraylist_ctor = search_method(env, arraylist_class, "<init>", "(I)V", false);
jobject result = env->NewObject(arraylist_class, arraylist_ctor, size);
if (result == NULL)
{
throw std::runtime_error("cannot create instance of class\n");
}
*add = search_method(env, arraylist_class, "add", "(Ljava/lang/Object;)Z", false);
return result;
}
|