|
| 1 | +#include "binding.hpp" |
| 2 | + |
| 3 | +namespace java { namespace lang { struct Object; } } |
| 4 | +namespace java { namespace lang { struct String; } } |
| 5 | + |
| 6 | +template <> struct jni::Name<java::lang::Object> { |
| 7 | + using Tag = jni::ObjectTag; |
| 8 | +}; |
| 9 | + |
| 10 | +template <> struct jni::Name<java::lang::String> { |
| 11 | + using Tag = jni::StringTag; |
| 12 | +}; |
| 13 | + |
| 14 | + |
| 15 | +namespace java { |
| 16 | +namespace lang { |
| 17 | + |
| 18 | +struct Object : jni::Binding<Object> { |
| 19 | + using Binding::Binding; |
| 20 | +}; |
| 21 | + |
| 22 | +struct String : jni::Binding<String> { |
| 23 | + using Binding::Binding; |
| 24 | + |
| 25 | + // Java methods |
| 26 | + |
| 27 | + jni::jint length(jni::JNIEnv& env) { |
| 28 | + static const auto method = jni_GetMethod<jni::jint()>(env, "length"); |
| 29 | + return self.Call(env, method); |
| 30 | + } |
| 31 | +}; |
| 32 | + |
| 33 | +} // namespace lang |
| 34 | +} // namespace java |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | + |
| 39 | +template <> struct jni::Name<struct HighLevelBinding>::Tag { |
| 40 | + static constexpr auto Name() { return "HighLevelBinding"; } |
| 41 | +}; |
| 42 | + |
| 43 | +struct HighLevelBinding : jni::Binding<HighLevelBinding> { |
| 44 | + using Binding::Binding; |
| 45 | + |
| 46 | + HighLevelBinding(jni::JNIEnv& env) : Binding(jni_New<>(env)) {} |
| 47 | + |
| 48 | + // Java methods |
| 49 | + jni::jint quadruple(jni::JNIEnv& env, jni::jint num) { |
| 50 | + // Call Java method |
| 51 | + static const auto method = jni_GetMethod<jni::jint(jni::jint)>(env, "quadruple"); |
| 52 | + return self.Call(env, method, num); |
| 53 | + } |
| 54 | + |
| 55 | + // Native methods |
| 56 | + void greet(jni::JNIEnv&, java::lang::String args); |
| 57 | + void greet(jni::JNIEnv&, jni::jint args); |
| 58 | + static void greet(jni::JNIEnv&, jni::jdouble args); |
| 59 | + |
| 60 | + |
| 61 | + static void jni_Register(jni::JNIEnv& env) { |
| 62 | + jni::RegisterNatives(env, jni_Class(env), |
| 63 | + jni_Bind<void(java::lang::String)>::Method<&HighLevelBinding::greet>("greet"), |
| 64 | + jni_Bind<void(jni::jint)>::Method<&HighLevelBinding::greet>("greet"), |
| 65 | + jni_Bind<void(jni::jdouble)>::StaticMethod<&HighLevelBinding::greet>("greet") |
| 66 | + ); |
| 67 | + } |
| 68 | +}; |
| 69 | + |
| 70 | + |
| 71 | +void HighLevelBinding::greet(jni::JNIEnv& env, java::lang::String args) { |
| 72 | + const auto test = jni::Make<std::string>(env, args); |
| 73 | + fprintf(stderr, "greet '%s' (length %d)\n", test.c_str(), args.length(env)); |
| 74 | +} |
| 75 | + |
| 76 | +void HighLevelBinding::greet(jni::JNIEnv& env, jni::jint args) { |
| 77 | + fprintf(stderr, "greet %d\n", quadruple(env, args)); |
| 78 | +} |
| 79 | + |
| 80 | +void HighLevelBinding::greet(jni::JNIEnv&, jni::jdouble args) { |
| 81 | + fprintf(stderr, "greet static %f\n", args); |
| 82 | +} |
| 83 | + |
| 84 | + |
| 85 | + |
| 86 | +extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) { |
| 87 | + jni::JNIEnv& env{ jni::GetEnv(*vm) }; |
| 88 | + try { |
| 89 | + java::lang::Object::jni_Register(env); |
| 90 | + java::lang::String::jni_Register(env); |
| 91 | + HighLevelBinding::jni_Register(env); |
| 92 | + } catch (const jni::PendingJavaException&) { |
| 93 | + jni::ExceptionDescribe(env); |
| 94 | + } |
| 95 | + return jni::Unwrap(jni::jni_version_1_2); |
| 96 | +} |
0 commit comments