gpt4 book ai didi

android - JNI 的 reinterpret_cast 的替代方案?

转载 作者:行者123 更新时间:2023-12-03 07:03:48 25 4
gpt4 key购买 nike

我正在关注 Google tips to implement a JNI layer在我的 Android 应用程序和我的 C++ 库之间。它建议在加载库时使用以下代码注册 native 方法:

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}

...

// Register your class' native methods.
static const JNINativeMethod methods[] = {
{"nativeFoo", "()V", reinterpret_cast<void*>(nativeFoo)},
{"nativeBar", "(Ljava/lang/String;I)Z", reinterpret_cast<void*>(nativeBar)},
};
int rc = env->RegisterNatives(c, methods, sizeof(methods)/sizeof(JNINativeMethod));
...
}

我对 C++ 很陌生,所以我决定使用 clang-tidy以确保我的 C++ 代码是现代且安全的。 clang-tidy报告:
error: do not use reinterpret_cast [cppcoreguidelines-pro-type-reinterpret-cast,-warnings-as-errors]

根据 clang-tidy documentation :

cppcoreguidelines-pro-type-reinterpret-cast

This check flags all uses of reinterpret_cast in C++ code.

Use of these casts can violate type safety and cause the program to access a variable that is actually of type X to be accessed as if it were of an unrelated type Z.

This rule is part of the “Type safety” profile of the C++ Core Guidelines, see https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Pro-type-reinterpretcast.



所以我有几个选择:
  • 使用 reinterpret_cast 禁用此检查和风险在别处不恰当
  • 在我需要使用它的任何地方忽略检查并创建一个困惑的代码库
  • 寻找一些更安全的实现方式

  • 如果可能的话,我想做 3,但我不太确定从哪里开始。

    最佳答案

    不清楚为什么GetEnv想要一个void**而不是 JNIEnv** (您会使用什么其他类型?),但您可以避免使用 reinterpret_cast以及伴随的未定义行为(!)与 临时 多变的:

    void *venv;
    if (vm->GetEnv(&venv, JNI_VERSION_1_6) != JNI_OK) {
    return JNI_ERR;
    }
    const auto env=static_cast<JNIEnv*>(venv);

    请注意, static_cast来自 void*reinterpret_cast 一样危险,但它在这里的使用是正确的、不可避免的,并且不应该产生 linter 警告。

    在函数指针的情况下,什么都不做: reinterpret_cast是唯一正确的选择(对于 void* 而不是像 void (*)() 这样的占位符函数指针类型,它的正确性不是 由 C++ 保证 ,尽管它适用于广泛并且 POSIX 确实保证它)。您当然可以在函数(模板)中隐藏该转换,以便可以告诉 linter 仅忽略它,但请确保使用清晰的名称以避免“隐藏”转换。

    关于android - JNI 的 reinterpret_cast 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60952032/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com