aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2018-03-07 23:51:30 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-03-07 23:51:30 +0000
commit7c4fc7558535c9501f96df0ba3db2dd9989ba690 (patch)
tree3fc35db2ddc57fea032831bfa18b02ad5c75184a
parent282e45d8cdfeb62dc76108629644e9e4b8befd50 (diff)
parentd8a0677a645b2d6f304cb0f071c040a7bc1997d5 (diff)
downloadplatform_libnativehelper-o-mr1-iot-preview-7.tar.gz
platform_libnativehelper-o-mr1-iot-preview-7.tar.bz2
platform_libnativehelper-o-mr1-iot-preview-7.zip
* changes: jni_macros: Clean-up clang-tidy warnings macros: Add more tests based on android_os_Parcel
-rw-r--r--platform_include/nativehelper/detail/signature_checker.h15
-rw-r--r--tests/Android.bp2
-rw-r--r--tests/JniSafeRegisterNativeMethods_test.cpp393
3 files changed, 389 insertions, 21 deletions
diff --git a/platform_include/nativehelper/detail/signature_checker.h b/platform_include/nativehelper/detail/signature_checker.h
index 3eb37be..7c2a7fc 100644
--- a/platform_include/nativehelper/detail/signature_checker.h
+++ b/platform_include/nativehelper/detail/signature_checker.h
@@ -272,8 +272,7 @@ struct ConstexprVector {
struct JniDescriptorNode {
ConstexprStringView longy;
- constexpr JniDescriptorNode(ConstexprStringView longy)
- : longy(longy) { // NOLINT: explicit.
+ constexpr JniDescriptorNode(ConstexprStringView longy) : longy(longy) { // NOLINT(google-explicit-constructor)
X_ASSERT(!longy.empty());
}
constexpr JniDescriptorNode() : longy() {}
@@ -305,7 +304,7 @@ struct ConstexprOptional {
}
// Create an optional with a value.
- constexpr ConstexprOptional(const T& value)
+ constexpr ConstexprOptional(const T& value) // NOLINT(google-explicit-constructor)
: _has_value(true), _value(value) {
}
@@ -368,7 +367,7 @@ inline std::ostream& operator<<(std::ostream& os, const ConstexprOptional<T>& va
// Mostly useful for macros that need to return an empty constexpr optional.
struct NullConstexprOptional {
template<typename T>
- constexpr operator ConstexprOptional<T>() const {
+ constexpr operator ConstexprOptional<T>() const { // NOLINT(google-explicit-constructor)
return ConstexprOptional<T>();
}
};
@@ -1409,7 +1408,7 @@ struct InferJniDescriptor {
// Expression to return JNINativeMethod, performs checking on signature+fn.
#define MAKE_CHECKED_JNI_NATIVE_METHOD(native_kind, name_, signature_, fn) \
([]() { \
- using namespace nativehelper::detail; \
+ using namespace nativehelper::detail; /* NOLINT(google-build-using-namespace) */ \
static_assert( \
MatchJniDescriptorWithFunctionType<native_kind, \
decltype(fn), \
@@ -1420,13 +1419,13 @@ struct InferJniDescriptor {
return JNINativeMethod { \
const_cast<decltype(JNINativeMethod::name)>(name_), \
const_cast<decltype(JNINativeMethod::signature)>(signature_), \
- reinterpret_cast<void*>(&fn)}; \
+ reinterpret_cast<void*>(&(fn))}; \
})()
// Expression to return JNINativeMethod, infers signature from fn.
#define MAKE_INFERRED_JNI_NATIVE_METHOD(native_kind, name_, fn) \
([]() { \
- using namespace nativehelper::detail; \
+ using namespace nativehelper::detail; /* NOLINT(google-build-using-namespace) */ \
/* Suppress implicit cast warnings by explicitly casting. */ \
return JNINativeMethod { \
const_cast<decltype(JNINativeMethod::name)>(name_), \
@@ -1434,7 +1433,7 @@ struct InferJniDescriptor {
InferJniDescriptor<native_kind, \
decltype(fn), \
fn>::GetStringAtRuntime()), \
- reinterpret_cast<void*>(&fn)}; \
+ reinterpret_cast<void*>(&(fn))}; \
})()
} // namespace detail
diff --git a/tests/Android.bp b/tests/Android.bp
index a5bdee9..31a9583 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -56,5 +56,7 @@ cc_test {
"-D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS",
],
+ tidy: true,
+
shared_libs: ["libnativehelper"],
}
diff --git a/tests/JniSafeRegisterNativeMethods_test.cpp b/tests/JniSafeRegisterNativeMethods_test.cpp
index 322a966..716b5f7 100644
--- a/tests/JniSafeRegisterNativeMethods_test.cpp
+++ b/tests/JniSafeRegisterNativeMethods_test.cpp
@@ -43,7 +43,7 @@ std::string stringify_helper(const T& val) {
#define EXPECT_STRINGIFY_EQ(x, y) EXPECT_EQ(stringify_helper(x), stringify_helper(y))
TEST(JniSafeRegisterNativeMethods, StringParsing) {
- using namespace nativehelper::detail; \
+ using namespace nativehelper::detail; // NOLINT
// Super basic bring-up tests for core functionality.
@@ -218,7 +218,7 @@ TEST(JniSafeRegisterNativeMethods, StringParsing) {
// Basic smoke tests for parameter validity.
// See below for more exhaustive tests.
TEST(JniSafeRegisterNativeMethods, ParameterTypes) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 0u));
EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 1u));
EXPECT_TRUE(IsJniParameterCountValid(kCriticalNative, 2u));
@@ -240,7 +240,7 @@ TEST(JniSafeRegisterNativeMethods, ParameterTypes) {
struct TestReturnAnything {
template <typename T>
- operator T() const {
+ operator T() const { // NOLINT
return T{};
}
};
@@ -375,7 +375,7 @@ struct TestJni {
// Template parameters must have linkage, which function-local structs lack.
TEST(JniSafeRegisterNativeMethods, FunctionTypes) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
// The exact error messages are not tested but they would be seen in the compiler
// stack trace when used from a constexpr context.
@@ -481,7 +481,7 @@ TEST(JniSafeRegisterNativeMethods, FunctionTypes) {
}
TEST(JniSafeRegisterNativeMethods, FunctionTypeDescriptorConversion) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
{
constexpr auto cvrt = MaybeMakeReifiedJniSignature<kCriticalNative,
decltype(TestJni::v_i),
@@ -534,7 +534,7 @@ struct apply_return_type {
#define FN_ARGS_PAIR(fn) decltype(fn), (fn)
TEST(JniSafeRegisterNativeMethods, FunctionTraits) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
using traits_for_int_ret =
FunctionTypeMetafunction<FN_ARGS_PAIR(test_function_traits::int_returning_function)>;
int applied = traits_for_int_ret::map_return<apply_return_type>();
@@ -567,7 +567,7 @@ constexpr size_t SumUpVector(const nativehelper::detail::ConstexprVector<T, kMax
template <typename T>
constexpr auto make_test_int_vector() {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
ConstexprVector<T, 5> vec_int;
vec_int.push_back(T{1});
vec_int.push_back(T{2});
@@ -578,7 +578,7 @@ constexpr auto make_test_int_vector() {
}
TEST(JniSafeRegisterNativeMethods, ConstexprOptional) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
ConstexprOptional<int> int_opt;
EXPECT_FALSE(int_opt.has_value());
@@ -589,7 +589,7 @@ TEST(JniSafeRegisterNativeMethods, ConstexprOptional) {
}
TEST(JniSafeRegisterNativeMethods, ConstexprVector) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
{
constexpr ConstexprVector<IntHolder, 5> vec_int = make_test_int_vector<IntHolder>();
constexpr size_t the_sum = SumUpVector(vec_int);
@@ -627,7 +627,7 @@ constexpr nativehelper::detail::JniDescriptorNode MakeNode(
EXPECT_EQUALISH_JNI_DESCRIPTORS_IMPL(user_desc, derived_desc, FALSE)
TEST(JniSafeRegisterNativeMethods, CompareJniDescriptorNodeErased) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
EXPECT_EQUALISH_JNI_DESCRIPTORS("V", void);
EXPECT_NOT_EQUALISH_JNI_DESCRIPTORS("V", jint);
EXPECT_EQUALISH_JNI_DESCRIPTORS("Z", jboolean);
@@ -693,7 +693,7 @@ TEST(JniSafeRegisterNativeMethods, CompareJniDescriptorNodeErased) {
} while(false);
TEST(JniSafeRegisterNativeMethods, MostSimilarTypeDescriptor) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("Z", jboolean);
EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("[[I", jobjectArray);
EXPECT_SIMILAR_TYPE_DESCRIPTOR_MATCH("[[Z", jobjectArray);
@@ -730,7 +730,7 @@ TEST(JniSafeRegisterNativeMethods, MostSimilarTypeDescriptor) {
EXPECT_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION_IMPL(FALSE, native_kind, func, desc)
TEST(JniSafeRegisterNativeMethods, MatchJniDescriptorWithFunctionType) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
// Bad C++ signature.
EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kCriticalNative, TestJni::bad_cptr, "()V");
EXPECT_NO_MATCH_JNI_DESCRIPTOR_AGAINST_FUNCTION(kNormalNative, TestJni::bad_cptr, "()V");
@@ -766,7 +766,7 @@ TEST(JniSafeRegisterNativeMethods, MatchJniDescriptorWithFunctionType) {
}
TEST(JniSafeRegisterNativeMethods, Infer) {
- using namespace nativehelper::detail;
+ using namespace nativehelper::detail; // NOLINT
{
using Infer_v_eolib_t = InferJniDescriptor<kNormalNative,
decltype(TestJni::v_eolib),
@@ -884,6 +884,373 @@ static void TestJniMacros_v_lib_od(jlong, jint, jboolean) {}
static void TestJniMacros_v_eolib(JNIEnv*, jobject, jlong, jint, jboolean) {}
static void TestJniMacros_v_eolib_od(JNIEnv*, jobject, jlong, jint, jboolean) {}
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
+
+static jint android_os_Parcel_dataSize(jlong) { return 0; }
+static jint android_os_Parcel_dataAvail(jlong) { return 0; }
+static jint android_os_Parcel_dataPosition(jlong) { return 0; }
+static jint android_os_Parcel_dataCapacity(jlong) { return 0; }
+static jlong android_os_Parcel_setDataSize(JNIEnv*, jclass, jlong, jint) { return 0; }
+static void android_os_Parcel_setDataPosition(jlong, jint) {}
+static void android_os_Parcel_setDataCapacity(JNIEnv*, jclass, jlong, jint) {}
+static jboolean android_os_Parcel_pushAllowFds(jlong, jboolean) { return true; }
+static void android_os_Parcel_restoreAllowFds(jlong, jboolean) {}
+static void android_os_Parcel_writeByteArray(JNIEnv*, jclass, jlong, jbyteArray, jint, jint) {}
+
+static void android_os_Parcel_writeBlob(JNIEnv*, jclass, jlong, jbyteArray, jint, jint) {}
+static void android_os_Parcel_writeInt(JNIEnv*, jclass, jlong, jint) {}
+static void android_os_Parcel_writeLong(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jlong val) {}
+static void android_os_Parcel_writeFloat(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jfloat val) {}
+static void android_os_Parcel_writeDouble(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jdouble val) {}
+static void android_os_Parcel_writeString(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jstring val) {}
+static void android_os_Parcel_writeStrongBinder(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jobject object) {}
+static jlong android_os_Parcel_writeFileDescriptor(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jobject object) { return 0; }
+static jbyteArray android_os_Parcel_createByteArray(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr) { return nullptr; }
+
+static jboolean android_os_Parcel_readByteArray(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jbyteArray dest,
+ jint destLen) { return false; }
+static jbyteArray android_os_Parcel_readBlob(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr) { return nullptr; }
+
+static jint android_os_Parcel_readInt(jlong nativePtr) { return 0; }
+
+static jlong android_os_Parcel_readLong(jlong nativePtr) { return 0; }
+
+static jfloat android_os_Parcel_readFloat(jlong nativePtr) { return 0.0f; }
+static jdouble android_os_Parcel_readDouble(jlong nativePtr) { return 0.0; }
+
+static jstring android_os_Parcel_readString(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr) { return nullptr; }
+
+static jobject android_os_Parcel_readStrongBinder(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr) { return nullptr; }
+
+
+static jobject android_os_Parcel_readFileDescriptor(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr) { return nullptr; }
+
+static jobject android_os_Parcel_openFileDescriptor(JNIEnv* env,
+ jclass clazz,
+ jstring name,
+ jint mode) { return 0; }
+
+
+static jobject android_os_Parcel_dupFileDescriptor(JNIEnv* env,
+ jclass clazz,
+ jobject orig) { return 0; }
+
+
+static void android_os_Parcel_closeFileDescriptor(JNIEnv* env,
+ jclass clazz,
+ jobject object) {}
+
+
+static void android_os_Parcel_clearFileDescriptor(JNIEnv* env,
+ jclass clazz,
+ jobject object) {}
+
+
+static jlong android_os_Parcel_create(JNIEnv* env, jclass clazz) { return 0; }
+
+
+static jlong android_os_Parcel_freeBuffer(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr) { return 0; }
+
+
+static void android_os_Parcel_destroy(JNIEnv* env, jclass clazz, jlong nativePtr) {}
+
+
+static jbyteArray android_os_Parcel_marshall(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr) { return 0; }
+
+
+static jlong android_os_Parcel_unmarshall(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jbyteArray data,
+ jint offset,
+ jint length) { return 0; }
+
+
+static jint android_os_Parcel_compareData(JNIEnv* env,
+ jclass clazz,
+ jlong thisNativePtr,
+ jlong otherNativePtr) { return 0; }
+
+
+static jlong android_os_Parcel_appendFrom(JNIEnv* env,
+ jclass clazz,
+ jlong thisNativePtr,
+ jlong otherNativePtr,
+ jint offset,
+ jint length) { return 0; }
+
+
+static jboolean android_os_Parcel_hasFileDescriptors(jlong nativePtr) { return 0; }
+
+
+static void android_os_Parcel_writeInterfaceToken(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jstring name) {}
+
+
+static void android_os_Parcel_enforceInterface(JNIEnv* env,
+ jclass clazz,
+ jlong nativePtr,
+ jstring name) {}
+
+
+static jlong android_os_Parcel_getGlobalAllocSize(JNIEnv* env, jclass clazz) { return 0; }
+
+
+static jlong android_os_Parcel_getGlobalAllocCount(JNIEnv* env, jclass clazz) { return 0; }
+
+
+static jlong android_os_Parcel_getBlobAshmemSize(jlong nativePtr) { return 0; }
+
+#pragma clang diagnostic pop
+
+TEST(JniSafeRegisterNativeMethods, ParcelExample) {
+ // Test a wide range of automatic signature inferencing.
+ // This is taken from real code in android_os_Parcel.cpp.
+
+ const JNINativeMethod gParcelMethods[] = {
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeDataSize", android_os_Parcel_dataSize),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeDataAvail", android_os_Parcel_dataAvail),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeDataPosition", android_os_Parcel_dataPosition),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeDataCapacity", android_os_Parcel_dataCapacity),
+ // @FastNative
+ MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
+ "nativeSetDataSize", android_os_Parcel_setDataSize),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeSetDataPosition", android_os_Parcel_setDataPosition),
+ // @FastNative
+ MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
+ "nativeSetDataCapacity", android_os_Parcel_setDataCapacity),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativePushAllowFds", android_os_Parcel_pushAllowFds),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeRestoreAllowFds", android_os_Parcel_restoreAllowFds),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteByteArray", android_os_Parcel_writeByteArray),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteBlob", android_os_Parcel_writeBlob),
+ // @FastNative
+ MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteInt", android_os_Parcel_writeInt),
+ // @FastNative
+ MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteLong", android_os_Parcel_writeLong),
+ // @FastNative
+ MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteFloat", android_os_Parcel_writeFloat),
+ // @FastNative
+ MAKE_JNI_FAST_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteDouble", android_os_Parcel_writeDouble),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteString", android_os_Parcel_writeString),
+ MAKE_JNI_NATIVE_METHOD(
+ "nativeWriteStrongBinder", "(JLandroid/os/IBinder;)V", android_os_Parcel_writeStrongBinder),
+ MAKE_JNI_NATIVE_METHOD(
+ "nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", android_os_Parcel_writeFileDescriptor),
+
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeCreateByteArray", android_os_Parcel_createByteArray),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeReadByteArray", android_os_Parcel_readByteArray),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeReadBlob", android_os_Parcel_readBlob),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeReadInt", android_os_Parcel_readInt),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeReadLong", android_os_Parcel_readLong),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeReadFloat", android_os_Parcel_readFloat),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeReadDouble", android_os_Parcel_readDouble),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeReadString", android_os_Parcel_readString),
+ MAKE_JNI_NATIVE_METHOD(
+ "nativeReadStrongBinder", "(J)Landroid/os/IBinder;", android_os_Parcel_readStrongBinder),
+ MAKE_JNI_NATIVE_METHOD(
+ "nativeReadFileDescriptor", "(J)Ljava/io/FileDescriptor;", android_os_Parcel_readFileDescriptor),
+ MAKE_JNI_NATIVE_METHOD(
+ "openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", android_os_Parcel_openFileDescriptor),
+ MAKE_JNI_NATIVE_METHOD(
+ "dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", android_os_Parcel_dupFileDescriptor),
+ MAKE_JNI_NATIVE_METHOD(
+ "closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", android_os_Parcel_closeFileDescriptor),
+ MAKE_JNI_NATIVE_METHOD(
+ "clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", android_os_Parcel_clearFileDescriptor),
+
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeCreate", android_os_Parcel_create),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeFreeBuffer", android_os_Parcel_freeBuffer),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeDestroy", android_os_Parcel_destroy),
+
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeMarshall", android_os_Parcel_marshall),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeUnmarshall", android_os_Parcel_unmarshall),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeCompareData", android_os_Parcel_compareData),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeAppendFrom", android_os_Parcel_appendFrom),
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeHasFileDescriptors", android_os_Parcel_hasFileDescriptors),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeWriteInterfaceToken", android_os_Parcel_writeInterfaceToken),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "nativeEnforceInterface", android_os_Parcel_enforceInterface),
+
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "getGlobalAllocSize", android_os_Parcel_getGlobalAllocSize),
+ MAKE_JNI_NATIVE_METHOD_AUTOSIG(
+ "getGlobalAllocCount", android_os_Parcel_getGlobalAllocCount),
+
+ // @CriticalNative
+ MAKE_JNI_CRITICAL_NATIVE_METHOD_AUTOSIG(
+ "nativeGetBlobAshmemSize", android_os_Parcel_getBlobAshmemSize),
+ };
+
+ const JNINativeMethod gParcelMethodsExpected[] = {
+ // @CriticalNative
+ {"nativeDataSize", "(J)I", (void*)android_os_Parcel_dataSize},
+ // @CriticalNative
+ {"nativeDataAvail", "(J)I", (void*)android_os_Parcel_dataAvail},
+ // @CriticalNative
+ {"nativeDataPosition", "(J)I", (void*)android_os_Parcel_dataPosition},
+ // @CriticalNative
+ {"nativeDataCapacity", "(J)I", (void*)android_os_Parcel_dataCapacity},
+ // @FastNative
+ {"nativeSetDataSize", "(JI)J", (void*)android_os_Parcel_setDataSize},
+ // @CriticalNative
+ {"nativeSetDataPosition", "(JI)V", (void*)android_os_Parcel_setDataPosition},
+ // @FastNative
+ {"nativeSetDataCapacity", "(JI)V", (void*)android_os_Parcel_setDataCapacity},
+
+ // @CriticalNative
+ {"nativePushAllowFds", "(JZ)Z", (void*)android_os_Parcel_pushAllowFds},
+ // @CriticalNative
+ {"nativeRestoreAllowFds", "(JZ)V", (void*)android_os_Parcel_restoreAllowFds},
+
+ {"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeByteArray},
+ {"nativeWriteBlob", "(J[BII)V", (void*)android_os_Parcel_writeBlob},
+ // @FastNative
+ {"nativeWriteInt", "(JI)V", (void*)android_os_Parcel_writeInt},
+ // @FastNative
+ {"nativeWriteLong", "(JJ)V", (void*)android_os_Parcel_writeLong},
+ // @FastNative
+ {"nativeWriteFloat", "(JF)V", (void*)android_os_Parcel_writeFloat},
+ // @FastNative
+ {"nativeWriteDouble", "(JD)V", (void*)android_os_Parcel_writeDouble},
+ {"nativeWriteString", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeString},
+ {"nativeWriteStrongBinder", "(JLandroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder},
+ {"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)J", (void*)android_os_Parcel_writeFileDescriptor},
+
+ {"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray},
+ {"nativeReadByteArray", "(J[BI)Z", (void*)android_os_Parcel_readByteArray},
+ {"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob},
+ // @CriticalNative
+ {"nativeReadInt", "(J)I", (void*)android_os_Parcel_readInt},
+ // @CriticalNative
+ {"nativeReadLong", "(J)J", (void*)android_os_Parcel_readLong},
+ // @CriticalNative
+ {"nativeReadFloat", "(J)F", (void*)android_os_Parcel_readFloat},
+ // @CriticalNative
+ {"nativeReadDouble", "(J)D", (void*)android_os_Parcel_readDouble},
+ {"nativeReadString", "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString},
+ {"nativeReadStrongBinder", "(J)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder},
+ {"nativeReadFileDescriptor", "(J)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor},
+
+ {"openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor},
+ {"dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_dupFileDescriptor},
+ {"closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor},
+ {"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor},
+
+ {"nativeCreate", "()J", (void*)android_os_Parcel_create},
+ {"nativeFreeBuffer", "(J)J", (void*)android_os_Parcel_freeBuffer},
+ {"nativeDestroy", "(J)V", (void*)android_os_Parcel_destroy},
+
+ {"nativeMarshall", "(J)[B", (void*)android_os_Parcel_marshall},
+ {"nativeUnmarshall", "(J[BII)J", (void*)android_os_Parcel_unmarshall},
+ {"nativeCompareData", "(JJ)I", (void*)android_os_Parcel_compareData},
+ {"nativeAppendFrom", "(JJII)J", (void*)android_os_Parcel_appendFrom},
+ // @CriticalNative
+ {"nativeHasFileDescriptors", "(J)Z", (void*)android_os_Parcel_hasFileDescriptors},
+ {"nativeWriteInterfaceToken", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken},
+ {"nativeEnforceInterface", "(JLjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface},
+
+ {"getGlobalAllocSize", "()J", (void*)android_os_Parcel_getGlobalAllocSize},
+ {"getGlobalAllocCount", "()J", (void*)android_os_Parcel_getGlobalAllocCount},
+
+ // @CriticalNative
+ {"nativeGetBlobAshmemSize", "(J)J", (void*)android_os_Parcel_getBlobAshmemSize},
+ };
+
+ ASSERT_EQ(sizeof(gParcelMethodsExpected)/sizeof(JNINativeMethod),
+ sizeof(gParcelMethods)/sizeof(JNINativeMethod));
+
+
+ for (size_t i = 0; i < sizeof(gParcelMethods) / sizeof(JNINativeMethod); ++i) {
+ const JNINativeMethod& actual = gParcelMethods[i];
+ const JNINativeMethod& expected = gParcelMethodsExpected[i];
+
+ EXPECT_STREQ(expected.name, actual.name);
+ EXPECT_STREQ(expected.signature, actual.signature) << expected.name;
+ EXPECT_EQ(expected.fnPtr, actual.fnPtr) << expected.name;
+ }
+}
+
TEST(JniSafeRegisterNativeMethods, JniMacros) {
JNINativeMethod tmp_native_method; // shadow variable check.
(void)tmp_native_method;