Skip to content

Commit e0af078

Browse files
committed
feat: 增加 Qt 与 Java 类型的便捷互转支持()
- JString: 增加 operator QString() 隐式转换 - JByteArray: 增加与 QByteArray 互转及 toByteArray() - JObjectArray: 增加与 QStringList 互转及 toStringList() - JIntArray: 增加与 QList<int> 互转及 toQList() - JObject: 增加 as<T>() 泛型转换函数
1 parent a939d6b commit e0af078

45 files changed

Lines changed: 720 additions & 27 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

android-28/JByteArray.hpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,33 @@
11
#pragma once
22
#include "./JArray.hpp"
3+
#include <QtCore/QJniEnvironment>
4+
#include <QtCore/QByteArray>
35
class JByteArray : public JArray
46
{
57
public:
68
template<typename ...Ts>
79
explicit JByteArray(const char *className, const char *sig, Ts...agv) : JArray(className, sig, std::forward<Ts>(agv)...) {}
810
JByteArray(QJniObject obj) : JArray(obj) {}
9-
11+
JByteArray(const QByteArray &bytes) : JArray(QJniObject())
12+
{
13+
QJniEnvironment env;
14+
jbyteArray array = env->NewByteArray(bytes.size());
15+
if (array) {
16+
env->SetByteArrayRegion(array, 0, bytes.size(), reinterpret_cast<const jbyte*>(bytes.constData()));
17+
*static_cast<QJniObject*>(this) = QJniObject(array);
18+
}
19+
}
20+
QByteArray toByteArray() const
21+
{
22+
if (!isValid()) return QByteArray();
23+
QJniEnvironment env;
24+
jbyteArray array = object<jbyteArray>();
25+
if (!array) return QByteArray();
26+
jsize len = env->GetArrayLength(array);
27+
jbyte* buffer = env->GetByteArrayElements(array, nullptr);
28+
QByteArray result(reinterpret_cast<const char*>(buffer), len);
29+
env->ReleaseByteArrayElements(array, buffer, JNI_ABORT);
30+
return result;
31+
}
32+
operator QByteArray() const { return toByteArray(); }
1033
};

android-28/JIntArray.hpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,32 @@
11
#pragma once
22
#include "./JArray.hpp"
3+
#include <QtCore/QJniEnvironment>
4+
#include <QtCore/QList>
35
class JIntArray : public JArray
46
{
57
public:
68
template<typename ...Ts>
79
explicit JIntArray(const char *className, const char *sig, Ts...agv) : JArray(className, sig, std::forward<Ts>(agv)...) {}
810
JIntArray(QJniObject obj) : JArray(obj) {}
9-
11+
JIntArray(const QList<int> &list) : JArray(QJniObject())
12+
{
13+
QJniEnvironment env;
14+
jintArray array = env->NewIntArray(list.size());
15+
if (array) {
16+
env->SetIntArrayRegion(array, 0, list.size(), reinterpret_cast<const jint*>(list.constData()));
17+
*static_cast<QJniObject*>(this) = QJniObject(array);
18+
}
19+
}
20+
QList<int> toQList() const
21+
{
22+
if (!isValid()) return {};
23+
QJniEnvironment env;
24+
jintArray array = object<jintArray>();
25+
if (!array) return {};
26+
jsize len = env->GetArrayLength(array);
27+
QList<int> result(len, 0);
28+
env->GetIntArrayRegion(array, 0, len, reinterpret_cast<jint*>(result.data()));
29+
return result;
30+
}
31+
operator QList<int>() const { return toQList(); }
1032
};

android-28/JObject.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ class JObject : public QJniObject
88
template<typename ...Ts>
99
explicit JObject(const char *className, const char *sig, Ts...agv) : QJniObject(className, sig, std::forward<Ts>(agv)...) {}
1010
JObject(QJniObject obj) : QJniObject(obj) {}
11+
template<typename T>
12+
T as() const { return T(*this); }
1113
};

android-28/JObjectArray.hpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,39 @@
11
#pragma once
22
#include "./JArray.hpp"
3+
#include <QtCore/QJniEnvironment>
4+
#include <QtCore/QStringList>
35
class JObjectArray : public JArray
46
{
57
public:
68
template<typename ...Ts>
79
explicit JObjectArray(const char *className, const char *sig, Ts...agv) : JArray(className, sig, std::forward<Ts>(agv)...) {}
810
JObjectArray(QJniObject obj) : JArray(obj) {}
9-
11+
JObjectArray(const QStringList &list) : JArray(QJniObject())
12+
{
13+
QJniEnvironment env;
14+
jclass stringClass = env->FindClass("java/lang/String");
15+
jobjectArray array = env->NewObjectArray(list.size(), stringClass, nullptr);
16+
for (int i = 0; i < list.size(); ++i) {
17+
QJniObject jstr = QJniObject::fromString(list[i]);
18+
env->SetObjectArrayElement(array, i, jstr.object());
19+
}
20+
*static_cast<QJniObject*>(this) = QJniObject(array);
21+
}
22+
QStringList toStringList() const
23+
{
24+
if (!isValid()) return QStringList();
25+
QJniEnvironment env;
26+
jobjectArray array = object<jobjectArray>();
27+
if (!array) return QStringList();
28+
jsize len = env->GetArrayLength(array);
29+
QStringList result;
30+
result.reserve(len);
31+
for (jsize i = 0; i < len; ++i) {
32+
jobject elem = env->GetObjectArrayElement(array, i);
33+
result.append(QJniObject(elem).toString());
34+
env->DeleteLocalRef(elem);
35+
}
36+
return result;
37+
}
38+
operator QStringList() const { return toStringList(); }
1039
};

android-28/JString.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ class JString : public JObject
77
explicit JString(const char *className, const char *sig, Ts...agv) : JObject(className, sig, std::forward<Ts>(agv)...) {}
88
JString(QJniObject obj) : JObject(obj) {}
99
JString(const QString &string) : JObject(QJniObject::fromString(string)) {}
10+
operator QString() const { return toString(); }
1011
};

android-29/JByteArray.hpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,33 @@
11
#pragma once
22
#include "./JArray.hpp"
3+
#include <QtCore/QJniEnvironment>
4+
#include <QtCore/QByteArray>
35
class JByteArray : public JArray
46
{
57
public:
68
template<typename ...Ts>
79
explicit JByteArray(const char *className, const char *sig, Ts...agv) : JArray(className, sig, std::forward<Ts>(agv)...) {}
810
JByteArray(QJniObject obj) : JArray(obj) {}
9-
11+
JByteArray(const QByteArray &bytes) : JArray(QJniObject())
12+
{
13+
QJniEnvironment env;
14+
jbyteArray array = env->NewByteArray(bytes.size());
15+
if (array) {
16+
env->SetByteArrayRegion(array, 0, bytes.size(), reinterpret_cast<const jbyte*>(bytes.constData()));
17+
*static_cast<QJniObject*>(this) = QJniObject(array);
18+
}
19+
}
20+
QByteArray toByteArray() const
21+
{
22+
if (!isValid()) return QByteArray();
23+
QJniEnvironment env;
24+
jbyteArray array = object<jbyteArray>();
25+
if (!array) return QByteArray();
26+
jsize len = env->GetArrayLength(array);
27+
jbyte* buffer = env->GetByteArrayElements(array, nullptr);
28+
QByteArray result(reinterpret_cast<const char*>(buffer), len);
29+
env->ReleaseByteArrayElements(array, buffer, JNI_ABORT);
30+
return result;
31+
}
32+
operator QByteArray() const { return toByteArray(); }
1033
};

android-29/JIntArray.hpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,32 @@
11
#pragma once
22
#include "./JArray.hpp"
3+
#include <QtCore/QJniEnvironment>
4+
#include <QtCore/QList>
35
class JIntArray : public JArray
46
{
57
public:
68
template<typename ...Ts>
79
explicit JIntArray(const char *className, const char *sig, Ts...agv) : JArray(className, sig, std::forward<Ts>(agv)...) {}
810
JIntArray(QJniObject obj) : JArray(obj) {}
9-
11+
JIntArray(const QList<int> &list) : JArray(QJniObject())
12+
{
13+
QJniEnvironment env;
14+
jintArray array = env->NewIntArray(list.size());
15+
if (array) {
16+
env->SetIntArrayRegion(array, 0, list.size(), reinterpret_cast<const jint*>(list.constData()));
17+
*static_cast<QJniObject*>(this) = QJniObject(array);
18+
}
19+
}
20+
QList<int> toQList() const
21+
{
22+
if (!isValid()) return {};
23+
QJniEnvironment env;
24+
jintArray array = object<jintArray>();
25+
if (!array) return {};
26+
jsize len = env->GetArrayLength(array);
27+
QList<int> result(len, 0);
28+
env->GetIntArrayRegion(array, 0, len, reinterpret_cast<jint*>(result.data()));
29+
return result;
30+
}
31+
operator QList<int>() const { return toQList(); }
1032
};

android-29/JObject.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ class JObject : public QJniObject
88
template<typename ...Ts>
99
explicit JObject(const char *className, const char *sig, Ts...agv) : QJniObject(className, sig, std::forward<Ts>(agv)...) {}
1010
JObject(QJniObject obj) : QJniObject(obj) {}
11+
template<typename T>
12+
T as() const { return T(*this); }
1113
};

android-29/JObjectArray.hpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,39 @@
11
#pragma once
22
#include "./JArray.hpp"
3+
#include <QtCore/QJniEnvironment>
4+
#include <QtCore/QStringList>
35
class JObjectArray : public JArray
46
{
57
public:
68
template<typename ...Ts>
79
explicit JObjectArray(const char *className, const char *sig, Ts...agv) : JArray(className, sig, std::forward<Ts>(agv)...) {}
810
JObjectArray(QJniObject obj) : JArray(obj) {}
9-
11+
JObjectArray(const QStringList &list) : JArray(QJniObject())
12+
{
13+
QJniEnvironment env;
14+
jclass stringClass = env->FindClass("java/lang/String");
15+
jobjectArray array = env->NewObjectArray(list.size(), stringClass, nullptr);
16+
for (int i = 0; i < list.size(); ++i) {
17+
QJniObject jstr = QJniObject::fromString(list[i]);
18+
env->SetObjectArrayElement(array, i, jstr.object());
19+
}
20+
*static_cast<QJniObject*>(this) = QJniObject(array);
21+
}
22+
QStringList toStringList() const
23+
{
24+
if (!isValid()) return QStringList();
25+
QJniEnvironment env;
26+
jobjectArray array = object<jobjectArray>();
27+
if (!array) return QStringList();
28+
jsize len = env->GetArrayLength(array);
29+
QStringList result;
30+
result.reserve(len);
31+
for (jsize i = 0; i < len; ++i) {
32+
jobject elem = env->GetObjectArrayElement(array, i);
33+
result.append(QJniObject(elem).toString());
34+
env->DeleteLocalRef(elem);
35+
}
36+
return result;
37+
}
38+
operator QStringList() const { return toStringList(); }
1039
};

android-29/JString.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ class JString : public JObject
77
explicit JString(const char *className, const char *sig, Ts...agv) : JObject(className, sig, std::forward<Ts>(agv)...) {}
88
JString(QJniObject obj) : JObject(obj) {}
99
JString(const QString &string) : JObject(QJniObject::fromString(string)) {}
10+
operator QString() const { return toString(); }
1011
};

0 commit comments

Comments
 (0)