Skip to content

Commit bd7b283

Browse files
wilhuffa-maurice
authored andcommitted
Add C++ proxies for Java standard library types
This includes proxies for commonly used elements of java.util: * ArrayList * Collection * HashMap * Iterator * List * Map * Set Only commonly used methods are included. Additional methods can be added as needed. PiperOrigin-RevId: 324895315
1 parent 6bde07c commit bd7b283

20 files changed

+496
-15
lines changed

firestore/src/android/firestore_android.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,16 @@
3838
#include "firestore/src/android/wrapper.h"
3939
#include "firestore/src/android/write_batch_android.h"
4040
#include "firestore/src/include/firebase/firestore.h"
41+
#include "firestore/src/jni/array_list.h"
42+
#include "firestore/src/jni/collection.h"
4143
#include "firestore/src/jni/env.h"
44+
#include "firestore/src/jni/hash_map.h"
45+
#include "firestore/src/jni/iterator.h"
4246
#include "firestore/src/jni/jni.h"
47+
#include "firestore/src/jni/list.h"
4348
#include "firestore/src/jni/loader.h"
49+
#include "firestore/src/jni/map.h"
50+
#include "firestore/src/jni/set.h"
4451

4552
namespace firebase {
4653
namespace firestore {
@@ -185,6 +192,14 @@ bool FirestoreInternal::Initialize(App* app) {
185192
util::CheckAndClearJniExceptions(env);
186193

187194
jni::Loader loader(app);
195+
196+
jni::ArrayList::Initialize(loader);
197+
jni::Collection::Initialize(loader);
198+
jni::Iterator::Initialize(loader);
199+
jni::HashMap::Initialize(loader);
200+
jni::List::Initialize(loader);
201+
jni::Map::Initialize(loader);
202+
188203
CollectionReferenceInternal::Initialize(loader);
189204
if (!loader.ok()) {
190205
ReleaseClasses(app);

firestore/src/jni/array_list.cc

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "firestore/src/jni/array_list.h"
2+
3+
#include "app/src/util_android.h"
4+
#include "firestore/src/jni/env.h"
5+
#include "firestore/src/jni/loader.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
namespace {
11+
12+
Constructor<ArrayList> kConstructor("()V");
13+
Constructor<ArrayList> kConstructorWithSize("(I)V");
14+
15+
} // namespace
16+
17+
void ArrayList::Initialize(Loader& loader) {
18+
loader.LoadFromExistingClass("java/util/ArrayList",
19+
util::array_list::GetClass(), kConstructor,
20+
kConstructorWithSize);
21+
}
22+
23+
Local<ArrayList> ArrayList::Create(Env& env) { return env.New(kConstructor); }
24+
25+
Local<ArrayList> ArrayList::Create(Env& env, size_t size) {
26+
return env.New(kConstructorWithSize, size);
27+
}
28+
29+
} // namespace jni
30+
} // namespace firestore
31+
} // namespace firebase

firestore/src/jni/array_list.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifndef FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_ARRAY_LIST_H_
2+
#define FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_ARRAY_LIST_H_
3+
4+
#include "firestore/src/jni/list.h"
5+
6+
namespace firebase {
7+
namespace firestore {
8+
namespace jni {
9+
10+
/** A C++ proxy for a Java `ArrayList`. */
11+
class ArrayList : public List {
12+
public:
13+
using List::List;
14+
15+
static void Initialize(Loader& loader);
16+
17+
static Local<ArrayList> Create(Env& env);
18+
static Local<ArrayList> Create(Env& env, size_t size);
19+
};
20+
21+
} // namespace jni
22+
} // namespace firestore
23+
} // namespace firebase
24+
25+
#endif // FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_ARRAY_LIST_H_

firestore/src/jni/class.cc

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,31 @@
11
#include "firestore/src/jni/class.h"
22

3+
#include "app/src/util_android.h"
34
#include "firestore/src/jni/env.h"
5+
#include "firestore/src/jni/loader.h"
46

57
namespace firebase {
68
namespace firestore {
79
namespace jni {
10+
namespace {
11+
12+
constexpr char kClass[] = "java/lang/Class";
13+
Method<String> kGetName("getName", "()Ljava/lang/String;");
14+
Method<bool> kIsArray("isArray", "()Z");
15+
16+
} // namespace
17+
18+
void Class::Initialize(Loader& loader) {
19+
loader.LoadFromExistingClass(kClass, util::class_class::GetClass(), kGetName,
20+
kIsArray);
21+
}
822

923
std::string Class::GetName(Env& env) const {
10-
jmethodID method = env.GetMethodId(*this, "name", "()Ljava/lang/String;");
11-
return env.Call<String>(*this, method).ToString(env);
24+
return env.Call(*this, kGetName).ToString(env);
1225
}
1326

27+
bool Class::IsArray(Env& env) const { return env.Call(*this, kIsArray); }
28+
1429
} // namespace jni
1530
} // namespace firestore
1631
} // namespace firebase

firestore/src/jni/class.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <string>
55

6+
#include "firestore/src/jni/jni_fwd.h"
67
#include "firestore/src/jni/object.h"
78

89
namespace firebase {
@@ -29,8 +30,12 @@ class Class : public Object {
2930
*/
3031
std::string GetName(Env& env) const;
3132

33+
bool IsArray(Env& env) const;
34+
3235
private:
3336
friend class Loader;
37+
38+
static void Initialize(Loader& loader);
3439
};
3540

3641
} // namespace jni

firestore/src/jni/collection.cc

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "firestore/src/jni/collection.h"
2+
3+
#include "app/src/util_android.h"
4+
#include "firestore/src/jni/env.h"
5+
#include "firestore/src/jni/iterator.h"
6+
#include "firestore/src/jni/loader.h"
7+
8+
namespace firebase {
9+
namespace firestore {
10+
namespace jni {
11+
namespace {
12+
13+
constexpr char kClass[] = "java/util/Collection";
14+
Method<bool> kAdd("add", "(Ljava/lang/Object;)Z");
15+
Method<Iterator> kIterator("iterator", "()Ljava/util/Iterator;");
16+
Method<size_t> kSize("size", "()I");
17+
18+
} // namespace
19+
20+
void Collection::Initialize(Loader& loader) {
21+
loader.LoadClass(kClass, kAdd, kIterator, kSize);
22+
}
23+
24+
bool Collection::Add(Env& env, const Object& object) {
25+
return env.Call(*this, kAdd, object);
26+
}
27+
28+
Local<Iterator> Collection::Iterator(Env& env) {
29+
return env.Call(*this, kIterator);
30+
}
31+
32+
size_t Collection::Size(Env& env) const { return env.Call(*this, kSize); }
33+
34+
} // namespace jni
35+
} // namespace firestore
36+
} // namespace firebase

firestore/src/jni/collection.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_COLLECTION_H_
2+
#define FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_COLLECTION_H_
3+
4+
#include "firestore/src/jni/jni_fwd.h"
5+
#include "firestore/src/jni/object.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
11+
class Iterator;
12+
13+
/** A C++ proxy for a Java `Collection`. */
14+
class Collection : public Object {
15+
public:
16+
using Object::Object;
17+
18+
static void Initialize(Loader& loader);
19+
20+
bool Add(Env& env, const Object& object);
21+
Local<class Iterator> Iterator(Env& env);
22+
size_t Size(Env& env) const;
23+
};
24+
25+
} // namespace jni
26+
} // namespace firestore
27+
} // namespace firebase
28+
29+
#endif // FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_COLLECTION_H_

firestore/src/jni/hash_map.cc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "firestore/src/jni/hash_map.h"
2+
3+
#include "app/src/util_android.h"
4+
#include "firestore/src/jni/env.h"
5+
#include "firestore/src/jni/loader.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
namespace {
11+
12+
constexpr char kClass[] = "java/util/HashMap";
13+
Constructor<HashMap> kConstructor("()V");
14+
15+
} // namespace
16+
17+
void HashMap::Initialize(Loader& loader) {
18+
loader.LoadFromExistingClass(kClass, util::hash_map::GetClass(),
19+
kConstructor);
20+
}
21+
22+
Local<HashMap> HashMap::Create(Env& env) { return env.New(kConstructor); }
23+
24+
} // namespace jni
25+
} // namespace firestore
26+
} // namespace firebase

firestore/src/jni/hash_map.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifndef FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_HASH_MAP_H_
2+
#define FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_HASH_MAP_H_
3+
4+
#include "firestore/src/jni/jni_fwd.h"
5+
#include "firestore/src/jni/map.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
11+
/** A C++ proxy for a Java `HashMap`. */
12+
class HashMap : public Map {
13+
public:
14+
using Map::Map;
15+
16+
static void Initialize(Loader& loader);
17+
18+
static Local<HashMap> Create(Env& env);
19+
};
20+
21+
} // namespace jni
22+
} // namespace firestore
23+
} // namespace firebase
24+
25+
#endif // FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_HASH_MAP_H_

firestore/src/jni/iterator.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "firestore/src/jni/iterator.h"
2+
3+
#include "app/src/util_android.h"
4+
#include "firestore/src/jni/env.h"
5+
#include "firestore/src/jni/loader.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
namespace {
11+
12+
constexpr char kClass[] = "java/util/Iterator";
13+
Method<bool> kHasNext("hasNext", "()Z");
14+
Method<Object> kNext("next", "()Ljava/lang/Object;");
15+
16+
} // namespace
17+
18+
void Iterator::Initialize(Loader& loader) {
19+
loader.LoadFromExistingClass(kClass, util::iterator::GetClass(), kHasNext,
20+
kNext);
21+
}
22+
23+
bool Iterator::HasNext(Env& env) const { return env.Call(*this, kHasNext); }
24+
25+
Local<Object> Iterator::Next(Env& env) { return env.Call(*this, kNext); }
26+
27+
} // namespace jni
28+
} // namespace firestore
29+
} // namespace firebase

firestore/src/jni/iterator.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#ifndef FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_ITERATOR_H_
2+
#define FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_ITERATOR_H_
3+
4+
#include "firestore/src/jni/jni_fwd.h"
5+
#include "firestore/src/jni/object.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
11+
/** A C++ proxy for a Java `Iterator`. */
12+
class Iterator : public Object {
13+
public:
14+
using Object::Object;
15+
16+
static void Initialize(Loader& loader);
17+
18+
bool HasNext(Env& env) const;
19+
Local<Object> Next(Env& env);
20+
};
21+
22+
} // namespace jni
23+
} // namespace firestore
24+
} // namespace firebase
25+
26+
#endif // FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_ITERATOR_H_

firestore/src/jni/jni_fwd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#ifndef FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_JNI_FWD_H_
22
#define FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_JNI_FWD_H_
33

4+
#include <jni.h>
5+
46
namespace firebase {
57
namespace firestore {
68
namespace jni {

firestore/src/jni/list.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include "firestore/src/jni/list.h"
2+
3+
#include "app/src/util_android.h"
4+
#include "firestore/src/jni/env.h"
5+
#include "firestore/src/jni/loader.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
namespace {
11+
12+
Method<Object> kGet("get", "(I)Ljava/lang/Object;");
13+
Method<Object> kSet("set", "(ILjava/lang/Object;)Ljava/lang/Object;");
14+
15+
} // namespace
16+
17+
void List::Initialize(Loader& loader) {
18+
loader.LoadFromExistingClass("java/util/List", util::list::GetClass(), kGet,
19+
kSet);
20+
}
21+
22+
Local<Object> List::Get(Env& env, size_t i) const {
23+
return env.Call(*this, kGet, i);
24+
}
25+
26+
Local<Object> List::Set(Env& env, size_t i, const Object& object) {
27+
return env.Call(*this, kSet, i, object);
28+
}
29+
30+
} // namespace jni
31+
} // namespace firestore
32+
} // namespace firebase

firestore/src/jni/list.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#ifndef FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_LIST_H_
2+
#define FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_LIST_H_
3+
4+
#include "firestore/src/jni/collection.h"
5+
#include "firestore/src/jni/jni_fwd.h"
6+
7+
namespace firebase {
8+
namespace firestore {
9+
namespace jni {
10+
11+
/** A C++ proxy for a Java `List`. */
12+
class List : public Collection {
13+
public:
14+
using Collection::Collection;
15+
16+
static void Initialize(Loader& loader);
17+
18+
Local<Object> Get(Env& env, size_t i) const;
19+
Local<Object> Set(Env& env, size_t i, const Object& object);
20+
};
21+
22+
} // namespace jni
23+
} // namespace firestore
24+
} // namespace firebase
25+
26+
#endif // FIREBASE_FIRESTORE_CLIENT_CPP_SRC_JNI_LIST_H_

0 commit comments

Comments
 (0)