Skip to content

Commit 25a40bf

Browse files
spinorxjfirebaugh
authored andcommitted
Support Array<jbyte> <-> std::string conversions.
Array<jbyte> <-> std::string conversions are needed to push protocol buffers across jni boundaries by serializing and deserializing.
1 parent 00871de commit 25a40bf

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

include/jni/array.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,22 @@ namespace jni
180180
SetArrayRegion(env, *result, 0, array);
181181
return result;
182182
}
183+
184+
inline
185+
std::string MakeAnything(ThingToMake<std::string>, JNIEnv& env, const Array<jbyte>& array)
186+
{
187+
NullCheck(env, array.Get());
188+
std::string result;
189+
result.resize(GetArrayLength(env, *array));
190+
GetArrayRegion(env, *array, 0, result.size(), reinterpret_cast<jbyte*>(&result[0]));
191+
return result;
192+
}
193+
194+
inline
195+
Array<jbyte> MakeAnything(ThingToMake<Array<jbyte>>, JNIEnv& env, const std::string& string)
196+
{
197+
Array<jbyte> result(&NewArray<jbyte>(env, string.size()));
198+
SetArrayRegion(env, *result, 0, string.size(), reinterpret_cast<const jbyte*>(&string[0]));
199+
return result;
200+
}
183201
}

test/high_level.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,23 @@ int main()
593593
assert(booleanArray.Length(env) == 42);
594594
assert(booleanArray.Get(env, 0) == jni::jni_true);
595595

596+
static Testable<jni::jarray<jni::jbyte>> byteArrayValue;
597+
598+
env.functions->GetArrayLength = [] (JNIEnv*, jarray array) -> jsize
599+
{
600+
assert(array == jni::Unwrap(byteArrayValue.Ptr()));
601+
return 42;
602+
};
603+
604+
env.functions->GetByteArrayRegion = [] (JNIEnv*, jbyteArray, jsize, jsize, jbyte* buf)
605+
{
606+
*buf = 's';
607+
};
608+
609+
jni::Array<jni::jbyte> byteArray { byteArrayValue.Ptr() };
610+
assert(byteArray.Length(env) == 42);
611+
assert(byteArray.Get(env, 0) == 's');
612+
596613

597614
/// Object Array
598615

@@ -746,6 +763,39 @@ int main()
746763
assert(jni::Make<std::vector<jboolean>>(env, jni::Make<jni::Array<jni::jboolean>>(env, vec)) == vec);
747764

748765

766+
env.functions->NewByteArray = [] (JNIEnv*, jsize) -> jbyteArray
767+
{
768+
return jni::Unwrap(byteArrayValue.Ptr());
769+
};
770+
771+
env.functions->GetArrayLength = [] (JNIEnv*, jarray array) -> jsize
772+
{
773+
assert(array == jni::Unwrap(byteArrayValue.Ptr()));
774+
return 1;
775+
};
776+
777+
env.functions->GetByteArrayRegion = [] (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte* buf)
778+
{
779+
assert(array == jni::Unwrap(byteArrayValue.Ptr()));
780+
assert(start == 0);
781+
assert(len == 1);
782+
*buf = 's';
783+
};
784+
785+
env.functions->SetByteArrayRegion = [] (JNIEnv*, jbyteArray array, jsize start, jsize len, const jbyte* buf)
786+
{
787+
assert(array == jni::Unwrap(byteArrayValue.Ptr()));
788+
assert(start == 0);
789+
assert(len == 1);
790+
assert(*buf == 's');
791+
};
792+
793+
std::vector<jbyte> byte_vec = { 's' };
794+
assert(jni::Make<std::vector<jbyte>>(env, jni::Make<jni::Array<jni::jbyte>>(env, byte_vec)) == byte_vec);
795+
std::string str("s");
796+
assert(jni::Make<std::string>(env, jni::Make<jni::Array<jni::jbyte>>(env, str)) == str);
797+
798+
749799
jni::MakeNativeMethod<decltype(&Method), &Method>("name");
750800
jni::MakeNativeMethod<decltype(&StaticMethod), &StaticMethod>("name");
751801

0 commit comments

Comments
 (0)