我了解到JNI接口指针(JNIEnv*)仅在当前线程中有效.假设我在本机方法中启动了一个新线程; 它如何异步发送事件到Java方法?由于这个新线程不能有(JNIEnv*)的引用.为(JNIEnv*)存储全局变量显然不起作用?
我在IBM上读到了这一点
要访问Java对象的字段并调用其方法,本机代码必须调用FindClass(),GetFieldID(),GetMethodId()和GetStaticMethodID().对于GetFieldID(),GetMethodID()和GetStaticMethodID(),为给定类返回的ID在JVM进程的生命周期内不会更改.但是获取字段或方法的调用可能需要在JVM中进行大量工作,因为字段和方法可能已经从超类继承,使得JVM在类层次结构中向上移动以找到它们.因为给定类的ID是相同的,所以您应该查找它们一次,然后重复使用它们.同样,查找类对象可能很昂贵,因此它们也应该被缓存.
一个人如何缓存的methodID,fieldID以及class在JNI对象?是否有必须遵循的内置方法或特定程序?
C++ 核心指南建议dynamic_cast在“类层次结构导航不可避免”时使用。这触发铛,整洁抛出以下错误:Do not use static_cast to downcast from a base to a derived class; use dynamic_cast instead [cppcoreguidelines-pro-type-static-cast-downcast]。
指导方针继续说:
注意:
像其他演员一样,
dynamic_cast被过度使用。更喜欢virtual函数而不是铸造。在可能的情况下(不需要运行时解析)并且相当方便,更喜欢静态多态性而不是层次结构导航。
我一直只使用嵌套在我的基类中的enum命名Kind,并static_cast根据其类型执行 a 。阅读 C++ 核心指南,“...即便如此,根据我们的经验,诸如“我知道我在做什么”的情况仍然是一个已知的错误来源。” 建议我不应该这样做。通常,我没有任何virtual函数,所以 RTTI 不存在使用dynamic_cast(例如,我会得到error: 'Base_discr' is not polymorphic)。我总是可以添加一个virtual函数,但这听起来很傻。该指南还说在考虑使用我使用的判别方法之前先进行基准测试Kind。
enum class Kind : unsigned char {
A,
B,
};
class Base_virt {
public:
Base_virt(Kind p_kind) noexcept : m_kind{p_kind}, m_x{} …Run Code Online (Sandbox Code Playgroud) c++ polymorphism dynamic-cast static-polymorphism cpp-core-guidelines