Skip to content

Commit b12eaa7

Browse files
committed
More syntactic sugar in high-level interface
1 parent 0c37c5f commit b12eaa7

File tree

4 files changed

+72
-30
lines changed

4 files changed

+72
-30
lines changed

examples/hello.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ static void RegisterHighLevel(JavaVM* vm)
4444

4545
jni::JNIEnv& env { jni::GetEnv(*vm) };
4646

47-
static jni::Class<System> system = jni::Class<System>::Find(env).NewGlobalRef(env).Release();
48-
static jni::Class<PrintStream> printStream = jni::Class<PrintStream>::Find(env).NewGlobalRef(env).Release();
47+
static auto system = jni::Class<System>::Find(env).NewGlobalRef(env).Release();
48+
static auto printStream = jni::Class<PrintStream>::Find(env).NewGlobalRef(env).Release();
4949

50-
static jni::StaticField<System, jni::Object<PrintStream>> out { env, system, "out" };
51-
static jni::Method<PrintStream, void (jni::String)> println { env, printStream, "println" };
50+
static auto out = system.GetStaticField<jni::Object<PrintStream>>(env, "out");
51+
static auto println = printStream.GetMethod<void (jni::String)>(env, "println");
5252

5353
auto greet = [] (jni::JNIEnv& env, jni::Object<Greeter>, jni::Array<jni::String> args)
5454
{

include/jni/array.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ namespace jni
6262
{
6363
SetArrayRegion(env, SafeDereference(env, array), start, buf);
6464
}
65+
66+
static Array<E> New(JNIEnv& env, jsize length)
67+
{
68+
return Array<E>(&NewArray<E>(env, length));
69+
}
6570
};
6671

6772
template < class TheTag >
@@ -107,6 +112,11 @@ namespace jni
107112
{
108113
SetObjectArrayElement(env, SafeDereference(env, array), index, Untag(value));
109114
}
115+
116+
static Array<Object<TheTag>> New(JNIEnv& env, jsize length, const Class<TheTag>& clazz, const Object<TheTag>& initialElement = Object<TheTag>())
117+
{
118+
return Array<Object<TheTag>>(&NewObjectArray(env, length, clazz, initialElement.Get()));
119+
}
110120
};
111121

112122

include/jni/class.hpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ namespace jni
77
{
88
template < class TheTag > class Object;
99
template < class TheTag, class... > class Constructor;
10+
template < class TheTag, class > class Field;
1011
template < class TheTag, class > class StaticField;
12+
template < class TheTag, class > class Method;
1113
template < class TheTag, class > class StaticMethod;
1214

1315
template < class TheTag >
@@ -41,7 +43,7 @@ namespace jni
4143
template < class T >
4244
T Get(JNIEnv& env, const StaticField<TagType, T>& field) const
4345
{
44-
return Tag<T>(GetStaticField<UntaggedType<T>>(env, clazz, field));
46+
return Tag<T>(jni::GetStaticField<UntaggedType<T>>(env, clazz, field));
4547
}
4648

4749
template < class T >
@@ -76,5 +78,35 @@ namespace jni
7678
{
7779
return Class(FindClass(env, TagType::Name()));
7880
}
81+
82+
template < class... Args >
83+
Constructor<TagType, Args...> GetConstructor(JNIEnv& env)
84+
{
85+
return Constructor<TagType, Args...>(env, *this);
86+
}
87+
88+
template < class T >
89+
Field<TagType, T> GetField(JNIEnv& env, const char* name)
90+
{
91+
return Field<TagType, T>(env, *this, name);
92+
}
93+
94+
template < class T >
95+
StaticField<TagType, T> GetStaticField(JNIEnv& env, const char* name)
96+
{
97+
return StaticField<TagType, T>(env, *this, name);
98+
}
99+
100+
template < class T >
101+
Method<TagType, T> GetMethod(JNIEnv& env, const char* name)
102+
{
103+
return Method<TagType, T>(env, *this, name);
104+
}
105+
106+
template < class T >
107+
StaticMethod<TagType, T> GetStaticMethod(JNIEnv& env, const char* name)
108+
{
109+
return StaticMethod<TagType, T>(env, *this, name);
110+
}
79111
};
80112
}

test/high_level.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ int main()
127127
return jni::Unwrap(objectValue.Ptr());
128128
};
129129

130-
jni::Constructor<Test> defaultNew { env, testClass };
131-
jni::Constructor<Test, jni::jboolean> booleanNew { env, testClass };
132-
jni::Constructor<Test, jni::Object<Test>> objectNew { env, testClass };
130+
auto defaultNew = testClass.GetConstructor(env);
131+
auto booleanNew = testClass.GetConstructor<jni::jboolean>(env);
132+
auto objectNew = testClass.GetConstructor<jni::Object<Test>>(env);
133133

134134
assert(testClass.New(env, defaultNew).Get() == object.Get());
135135
assert(testClass.New(env, booleanNew, jni::jni_true).Get() == object.Get());
@@ -185,8 +185,8 @@ int main()
185185
assert(value == jni::Unwrap(objectValue.Ptr()));
186186
};
187187

188-
jni::StaticField<Test, jni::jboolean> booleanStaticField { env, testClass, booleanFieldName };
189-
jni::StaticField<Test, jni::Object<Test>> objectStaticField { env, testClass, objectFieldName };
188+
auto booleanStaticField = testClass.GetStaticField<jni::jboolean>(env, booleanFieldName);
189+
auto objectStaticField = testClass.GetStaticField<jni::Object<Test>>(env, objectFieldName);
190190

191191
assert(testClass.Get(env, booleanStaticField) == jni::jni_true);
192192
assert(testClass.Get(env, objectStaticField).Get() == object.Get());
@@ -226,8 +226,8 @@ int main()
226226
assert(value == jni::Unwrap(objectValue.Ptr()));
227227
};
228228

229-
jni::Field<Test, jni::jboolean> booleanField { env, testClass, booleanFieldName };
230-
jni::Field<Test, jni::Object<Test>> objectField { env, testClass, objectFieldName };
229+
auto booleanField = testClass.GetField<jni::jboolean>(env, booleanFieldName);
230+
auto objectField = testClass.GetField<jni::Object<Test>>(env, objectFieldName);
231231
assert(object.Get(env, booleanField) == true);
232232
assert(object.Get(env, objectField).Get() == object.Get());
233233
object.Set(env, booleanField, jni::jni_false);
@@ -325,9 +325,9 @@ int main()
325325
va_end(args);
326326
};
327327

328-
jni::StaticMethod<Test, void ()> voidVoidStaticMethod { env, testClass, voidMethodName };
329-
jni::StaticMethod<Test, void (jni::jboolean)> voidBooleanStaticMethod { env, testClass, voidMethodName };
330-
jni::StaticMethod<Test, void (jni::Object<Test>)> voidObjectStaticMethod { env, testClass, voidMethodName };
328+
auto voidVoidStaticMethod = testClass.GetStaticMethod<void ()>(env, voidMethodName);
329+
auto voidBooleanStaticMethod = testClass.GetStaticMethod<void (jni::jboolean)>(env, voidMethodName);
330+
auto voidObjectStaticMethod = testClass.GetStaticMethod<void (jni::Object<Test>)>(env, voidMethodName);
331331

332332
testClass.Call(env, voidVoidStaticMethod);
333333
testClass.Call(env, voidBooleanStaticMethod, jni::jni_true);
@@ -357,9 +357,9 @@ int main()
357357
return JNI_TRUE;
358358
};
359359

360-
jni::StaticMethod<Test, jni::jboolean ()> booleanVoidStaticMethod { env, testClass, booleanMethodName };
361-
jni::StaticMethod<Test, jni::jboolean (jni::jboolean)> booleanBooleanStaticMethod { env, testClass, booleanMethodName };
362-
jni::StaticMethod<Test, jni::jboolean (jni::Object<Test>)> booleanObjectStaticMethod { env, testClass, booleanMethodName };
360+
auto booleanVoidStaticMethod = testClass.GetStaticMethod<jni::jboolean ()>(env, booleanMethodName);
361+
auto booleanBooleanStaticMethod = testClass.GetStaticMethod<jni::jboolean (jni::jboolean)>(env, booleanMethodName);
362+
auto booleanObjectStaticMethod = testClass.GetStaticMethod<jni::jboolean (jni::Object<Test>)>(env, booleanMethodName);
363363

364364
assert(testClass.Call(env, booleanVoidStaticMethod) == jni::jni_true);
365365
assert(testClass.Call(env, booleanBooleanStaticMethod, jni::jni_true) == jni::jni_true);
@@ -389,9 +389,9 @@ int main()
389389
return jni::Unwrap(objectValue.Ptr());
390390
};
391391

392-
jni::StaticMethod<Test, jni::Object<Test> ()> objectVoidStaticMethod { env, testClass, objectMethodName };
393-
jni::StaticMethod<Test, jni::Object<Test> (jni::jboolean)> objectBooleanStaticMethod { env, testClass, objectMethodName };
394-
jni::StaticMethod<Test, jni::Object<Test> (jni::Object<Test>)> objectObjectStaticMethod { env, testClass, objectMethodName };
392+
auto objectVoidStaticMethod = testClass.GetStaticMethod<jni::Object<Test> ()>(env, objectMethodName);
393+
auto objectBooleanStaticMethod = testClass.GetStaticMethod<jni::Object<Test> (jni::jboolean)>(env, objectMethodName);
394+
auto objectObjectStaticMethod = testClass.GetStaticMethod<jni::Object<Test> (jni::Object<Test>)>(env, objectMethodName);
395395

396396
assert(testClass.Call(env, objectVoidStaticMethod).Get() == object.Get());
397397
assert(testClass.Call(env, objectBooleanStaticMethod, jni::jni_true).Get() == object.Get());
@@ -425,9 +425,9 @@ int main()
425425
va_end(args);
426426
};
427427

428-
jni::Method<Test, void ()> voidVoidMethod { env, testClass, voidMethodName };
429-
jni::Method<Test, void (jni::jboolean)> voidBooleanMethod { env, testClass, voidMethodName };
430-
jni::Method<Test, void (jni::Object<Test>)> voidObjectMethod { env, testClass, voidMethodName };
428+
auto voidVoidMethod = testClass.GetMethod<void ()>(env, voidMethodName);
429+
auto voidBooleanMethod = testClass.GetMethod<void (jni::jboolean)>(env, voidMethodName);
430+
auto voidObjectMethod = testClass.GetMethod<void (jni::Object<Test>)>(env, voidMethodName);
431431

432432
object.Call(env, voidVoidMethod);
433433
object.Call(env, voidBooleanMethod, jni::jni_true);
@@ -457,9 +457,9 @@ int main()
457457
return JNI_TRUE;
458458
};
459459

460-
jni::Method<Test, jni::jboolean ()> booleanVoidMethod { env, testClass, booleanMethodName };
461-
jni::Method<Test, jni::jboolean (jni::jboolean)> booleanBooleanMethod { env, testClass, booleanMethodName };
462-
jni::Method<Test, jni::jboolean (jni::Object<Test>)> booleanObjectMethod { env, testClass, booleanMethodName };
460+
auto booleanVoidMethod = testClass.GetMethod<jni::jboolean ()>(env, booleanMethodName);
461+
auto booleanBooleanMethod = testClass.GetMethod<jni::jboolean (jni::jboolean)>(env, booleanMethodName);
462+
auto booleanObjectMethod = testClass.GetMethod<jni::jboolean (jni::Object<Test>)>(env, booleanMethodName);
463463

464464
assert(object.Call(env, booleanVoidMethod) == jni::jni_true);
465465
assert(object.Call(env, booleanBooleanMethod, jni::jni_true) == jni::jni_true);
@@ -489,9 +489,9 @@ int main()
489489
return jni::Unwrap(objectValue.Ptr());
490490
};
491491

492-
jni::Method<Test, jni::Object<Test> ()> objectVoidMethod { env, testClass, objectMethodName };
493-
jni::Method<Test, jni::Object<Test> (jni::jboolean)> objectBooleanMethod { env, testClass, objectMethodName };
494-
jni::Method<Test, jni::Object<Test> (jni::Object<Test>)> objectObjectMethod { env, testClass, objectMethodName };
492+
auto objectVoidMethod = testClass.GetMethod<jni::Object<Test> ()>(env, objectMethodName);
493+
auto objectBooleanMethod = testClass.GetMethod<jni::Object<Test> (jni::jboolean)>(env, objectMethodName);
494+
auto objectObjectMethod = testClass.GetMethod<jni::Object<Test> (jni::Object<Test>)>(env, objectMethodName);
495495

496496
assert(object.Call(env, objectVoidMethod).Get() == object.Get());
497497
assert(object.Call(env, objectBooleanMethod, jni::jni_true).Get() == object.Get());

0 commit comments

Comments
 (0)