Skip to content
Snippets Groups Projects
Commit 31285861 authored by Adrien Béraud's avatar Adrien Béraud
Browse files

bin/jni: avoid more copies in binding

Change-Id: Ibbc47b5caf610eb7a3dae2034201ed809f02e91b
parent 066dde85
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,10 @@ struct DataView { ...@@ -8,6 +8,10 @@ struct DataView {
struct Data { struct Data {
std::vector<uint8_t> data; std::vector<uint8_t> data;
}; };
struct String {
std::string str;
};
} }
%} %}
...@@ -15,6 +19,7 @@ struct Data { ...@@ -15,6 +19,7 @@ struct Data {
namespace jami { namespace jami {
struct DataView; struct DataView;
struct Data; struct Data;
struct String;
%typemap(jni) DataView "jbyteArray" %typemap(jni) DataView "jbyteArray"
%typemap(jtype) DataView "byte[]" %typemap(jtype) DataView "byte[]"
...@@ -24,7 +29,12 @@ struct Data; ...@@ -24,7 +29,12 @@ struct Data;
%typemap(jtype) Data "byte[]" %typemap(jtype) Data "byte[]"
%typemap(jstype) Data "byte[]" %typemap(jstype) Data "byte[]"
%typemap(jni) String "jbyteArray"
%typemap(jtype) String "byte[]"
%typemap(jstype) String "byte[]"
%typemap(javadirectorin) Data "$jniinput" %typemap(javadirectorin) Data "$jniinput"
%typemap(javadirectorin) String "$jniinput"
%typemap(javadirectorout) DataView "$javacall" %typemap(javadirectorout) DataView "$javacall"
%typemap(in) Data %typemap(in) Data
...@@ -36,6 +46,15 @@ struct Data; ...@@ -36,6 +46,15 @@ struct Data;
$1.data.resize(len); $1.data.resize(len);
jenv->GetByteArrayRegion($input, 0, len, (jbyte*)$1.data.data()); %} jenv->GetByteArrayRegion($input, 0, len, (jbyte*)$1.data.data()); %}
%typemap(in) String
%{ if(!$input) {
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string");
return $null;
}
jsize len = jenv->GetArrayLength($input);
$1.str.resize(len);
jenv->GetByteArrayRegion($input, 0, len, (jbyte*)$1.str.data()); %}
%typemap(out) DataView { %typemap(out) DataView {
jbyteArray r = jenv->NewByteArray($1.size); jbyteArray r = jenv->NewByteArray($1.size);
jenv->SetByteArrayRegion(r, 0, $1.size, (const jbyte *)$1.data); jenv->SetByteArrayRegion(r, 0, $1.size, (const jbyte *)$1.data);
...@@ -43,6 +62,7 @@ struct Data; ...@@ -43,6 +62,7 @@ struct Data;
} }
%typemap(javain) Data "$javainput" %typemap(javain) Data "$javainput"
%typemap(javain) String "$javainput"
%typemap(javaout) DataView { %typemap(javaout) DataView {
return $jnicall; return $jnicall;
......
...@@ -126,6 +126,9 @@ namespace std { ...@@ -126,6 +126,9 @@ namespace std {
} }
return out; return out;
} }
public void setUnicode(String key, String value) {
setRaw(key, Blob.bytesFromString(value));
}
%} %}
%extend map<string, string> { %extend map<string, string> {
...@@ -137,11 +140,11 @@ namespace std { ...@@ -137,11 +140,11 @@ namespace std {
} }
return k; return k;
} }
void setRaw(const std::string& key, const vector<uint8_t>& value) { void setRaw(const std::string& key, jami::String value) {
(*$self)[key] = std::string(value.data(), value.data()+value.size()); (*$self)[key] = std::move(value.str);
} }
jami::DataView getRaw(const std::string& key) { jami::DataView getRaw(const std::string& key) {
auto& v = $self->at(key); const auto& v = $self->at(key);
return {(const uint8_t*)v.data(), v.size()}; return {(const uint8_t*)v.data(), v.size()};
} }
} }
...@@ -151,8 +154,9 @@ namespace std { ...@@ -151,8 +154,9 @@ namespace std {
%typemap(javacode) vector< map<string,string> > %{ %typemap(javacode) vector< map<string,string> > %{
public java.util.ArrayList<java.util.Map<String, String>> toNative() { public java.util.ArrayList<java.util.Map<String, String>> toNative() {
java.util.ArrayList<java.util.Map<String, String>> out = new java.util.ArrayList<>(size()); int size = size();
for (int i = 0; i < size(); ++i) { java.util.ArrayList<java.util.Map<String, String>> out = new java.util.ArrayList<>(size);
for (int i = 0; i < size; ++i) {
out.add(get(i).toNative()); out.add(get(i).toNative());
} }
return out; return out;
...@@ -164,15 +168,16 @@ namespace std { ...@@ -164,15 +168,16 @@ namespace std {
%template(UintVect) vector<uint32_t>; %template(UintVect) vector<uint32_t>;
%typemap(javacode) vector<uint8_t> %{ %typemap(javacode) vector<uint8_t> %{
public static Blob fromString(String in) { public static byte[] bytesFromString(String in) {
byte[] dat;
try { try {
dat = in.getBytes("UTF-8"); return in.getBytes("UTF-8");
} catch (java.io.UnsupportedEncodingException e) { } catch (java.io.UnsupportedEncodingException e) {
dat = in.getBytes(); return in.getBytes();
} }
}
public static Blob fromString(String in) {
Blob n = new Blob(); Blob n = new Blob();
n.setBytes(dat); n.setBytes(bytesFromString(in));
return n; return n;
} }
%} %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment