Add support for naming JNI functions with the unstringify macro
The manually defined native JNI function tables allow defining a name that may be different from the actual function name; this name is then used from the Java-side. This can be useful to provide also as an option with the new "unstringifying" macros which can help for example in porting code to these new macros. Change-Id: Icfebfb351cb8dfb122795d20b37e2eac167a41bf Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit 58fd12a487cd2c628d713d1c42f8b53f8c4e9550) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
64a0cbe9ea
commit
814ccaa016
@ -349,17 +349,22 @@ constexpr auto QtJniTypes::typeSignature<QtJniTypes::Type>() \
|
|||||||
+ QtJniTypes::String(";"); \
|
+ QtJniTypes::String(";"); \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
|
#define Q_DECLARE_JNI_NATIVE_METHOD(...) \
|
||||||
|
QT_OVERLOADED_MACRO(QT_DECLARE_JNI_NATIVE_METHOD, __VA_ARGS__) \
|
||||||
|
|
||||||
#define Q_DECLARE_JNI_NATIVE_METHOD(Method) \
|
#define QT_DECLARE_JNI_NATIVE_METHOD_2(Method, Name) \
|
||||||
namespace QtJniMethods { \
|
namespace QtJniMethods { \
|
||||||
static constexpr auto Method##_signature = \
|
static constexpr auto Method##_signature = \
|
||||||
QtJniTypes::nativeMethodSignature(Method); \
|
QtJniTypes::nativeMethodSignature(Method); \
|
||||||
static const JNINativeMethod Method##_method = { \
|
static const JNINativeMethod Method##_method = { \
|
||||||
#Method, Method##_signature.data(), \
|
#Name, Method##_signature.data(), \
|
||||||
reinterpret_cast<void *>(Method) \
|
reinterpret_cast<void *>(Method) \
|
||||||
}; \
|
}; \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
|
#define QT_DECLARE_JNI_NATIVE_METHOD_1(Method) \
|
||||||
|
QT_DECLARE_JNI_NATIVE_METHOD_2(Method, Method) \
|
||||||
|
|
||||||
#define Q_JNI_NATIVE_METHOD(Method) QtJniMethods::Method##_method
|
#define Q_JNI_NATIVE_METHOD(Method) QtJniMethods::Method##_method
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -6,6 +6,7 @@ package org.qtproject.qt.android.testdatapackage;
|
|||||||
public class QtJniEnvironmentTestClass
|
public class QtJniEnvironmentTestClass
|
||||||
{
|
{
|
||||||
private static native void callbackFromJava(String message);
|
private static native void callbackFromJava(String message);
|
||||||
|
private static native void namedCallbackFromJava(String message);
|
||||||
private static native void intCallbackFromJava(int value);
|
private static native void intCallbackFromJava(int value);
|
||||||
|
|
||||||
public final int INT_FIELD = 123;
|
public final int INT_FIELD = 123;
|
||||||
@ -18,6 +19,11 @@ public class QtJniEnvironmentTestClass
|
|||||||
callbackFromJava("From Java: " + message);
|
callbackFromJava("From Java: " + message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void namedAppendJavaToString(String message)
|
||||||
|
{
|
||||||
|
namedCallbackFromJava("From Java (named): " + message);
|
||||||
|
}
|
||||||
|
|
||||||
public static void convertToInt(String message)
|
public static void convertToInt(String message)
|
||||||
{
|
{
|
||||||
intCallbackFromJava(Integer.parseInt(message));
|
intCallbackFromJava(Integer.parseInt(message));
|
||||||
|
@ -101,6 +101,13 @@ static void callbackFromJava(JNIEnv *env, jobject /*thiz*/, jstring value)
|
|||||||
}
|
}
|
||||||
Q_DECLARE_JNI_NATIVE_METHOD(callbackFromJava);
|
Q_DECLARE_JNI_NATIVE_METHOD(callbackFromJava);
|
||||||
|
|
||||||
|
static void tediouslyLongNamed_callbackFromJava(JNIEnv *env, jobject /*thiz*/, jstring value)
|
||||||
|
{
|
||||||
|
Q_UNUSED(env)
|
||||||
|
registerNativesString = QJniObject(value).toString();
|
||||||
|
}
|
||||||
|
Q_DECLARE_JNI_NATIVE_METHOD(tediouslyLongNamed_callbackFromJava, namedCallbackFromJava)
|
||||||
|
|
||||||
static void callbackFromJavaNoCtor(JNIEnv *env, jobject /*thiz*/, jstring value)
|
static void callbackFromJavaNoCtor(JNIEnv *env, jobject /*thiz*/, jstring value)
|
||||||
{
|
{
|
||||||
Q_UNUSED(env)
|
Q_UNUSED(env)
|
||||||
@ -126,6 +133,20 @@ void tst_QJniEnvironment::registerNativeMethods()
|
|||||||
QVERIFY(registerNativesString == QStringLiteral("From Java: Qt"));
|
QVERIFY(registerNativesString == QStringLiteral("From Java: Qt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Named native function
|
||||||
|
{
|
||||||
|
QVERIFY(env.registerNativeMethods(javaTestClass, {
|
||||||
|
Q_JNI_NATIVE_METHOD(tediouslyLongNamed_callbackFromJava)
|
||||||
|
}));
|
||||||
|
|
||||||
|
QJniObject::callStaticMethod<void>(javaTestClass,
|
||||||
|
"namedAppendJavaToString",
|
||||||
|
"(Ljava/lang/String;)V",
|
||||||
|
QtString.object<jstring>());
|
||||||
|
QTest::qWait(200);
|
||||||
|
QVERIFY(registerNativesString == QStringLiteral("From Java (named): Qt"));
|
||||||
|
}
|
||||||
|
|
||||||
// No default constructor in class
|
// No default constructor in class
|
||||||
{
|
{
|
||||||
QVERIFY(env.registerNativeMethods(javaTestClassNoCtor, {
|
QVERIFY(env.registerNativeMethods(javaTestClassNoCtor, {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user