Hippy项目源码分析Week5

Hippy项目源码分析Week5,第1张

Hippy项目源码分析Week5

2021SC@SDUSC

Hippy项目源码分析第五周
  • layout/android/jni
    • FlexNodeJni.h
    • scoped_java_ref.h

layout/android/jni FlexNodeJni.h

由于代码量较大且为自动生成的,故只贴出一部分

#pragma once

#include 

#include "FlexNodeUtil.h"

// Step 1: forward declarations.
static const char kFlexNodeClassPath[] = "com/tencent/smtt/flexbox/FlexNode";
// Leaking this jclass as we cannot use LazyInstance from some threads.
// Step 2: method stubs.
static jlong FlexNodeNew(JNIEnv* env, const base::android::JavaParamRef& jcaller);

JNI_GENERATOR_EXPORT jlong
Java_com_tencent_smtt_flexbox_FlexNode_nativeFlexNodeNew(JNIEnv* env, jobject jcaller) {
  return FlexNodeNew(env, base::android::JavaParamRef(env, jcaller));
}

JNI_GENERATOR_EXPORT void Java_com_tencent_smtt_flexbox_FlexNode_nativeFlexNodeFree(
    JNIEnv* env,
    jobject jcaller,
    jlong nativeFlexNode) {
  FlexNode* native = reinterpret_cast(nativeFlexNode);
  CHECK_NATIVE_PTR(env, jcaller, native, "FlexNodeFree");
  return native->FlexNodeFree(env, base::android::JavaParamRef(env, jcaller));
}

方便跨平台使用,在Android端与Java层通信需要使用JNI,使用了自动化方式来自动生成JNI注册代码以及反射调用Java的代码。

Method stub,“方法存根”或“存根”,是一段为了保证其他程序功能运行的代替代码块。
“存根”会模拟已有代码(例如远程计算机上的一段程序)的逻辑或成为待开发代码的临时替代者。
“存根”因此经常被用于程序移植,分布式计算和常规的软件开发和测试中。
“存根”在编程中较为常见,它除了声明函数,函数参数以及返回对于调用者来说在程序“正常执行过程”中预期的值之外并 没有其他任何作用。
“存根”经常作为实现一个已知接口的占位标志,这个接口的声明通常是一个不可更改或者广为熟知的名字但该接口并未实现类或者实现类未被终极化。
“存根”中具有足够的代码能通过编译并和程序中其他单元有一定联系,在RMI命名法中,“存根”将会与架构在服务端进行交互。

jni文件夹下的大部分内容均为自动生成,与FlexNodeJni.h类似

scoped_java_ref.h

由于代码内容量较大,本周只分析一部分,剩余部分留待下周。

#pragma once

#include 
#include 

#include 
#include 

// #include "base/base_export.h"
// #include "base/logging.h"
// #include "base/macros.h"
template 
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
JNIEnv* GetJNIEnv();

namespace base {
namespace android {
#define base_EXPORT
// Creates a new local reference frame, in which at least a given number of
// 创建一个新的本地引用帧,并至少赋值
// local references can be created. Note that local references already created
// 可以创建本地引用,需要注意,本地引用已经创建
// in previous local frames are still valid in the current local frame.
// 之前的本地帧在现在依旧可用
class ScopedJavaLocalframe {
 public:
  explicit ScopedJavaLocalframe(JNIEnv* env);
  ScopedJavaLocalframe(JNIEnv* env, int capacity);
  ~ScopedJavaLocalframe();

 private:
  // This class is only good for use on the thread it was created on so
  // 此类仅适用于在其创建的线程上使用
  // it's safe to cache the non-threadsafe JNIEnv* inside this object.
  // 在这个对象中缓存非线程安全的 JNIEnv* 是安全的。
  JNIEnv* env_;

  // DISALLOW_COPY_AND_ASSIGN(ScopedJavaLocalframe);
};

// Forward declare the generic java reference template class.
// 前向声明泛型 java 引用模板类。
template 
class JavaRef;

// Template specialization of JavaRef, which acts as the base class for all
// JavaRef 的模板特化,它充当所有对象的基类
// other JavaRef<> template types. This allows you to e.g. pass
// ScopedJavaLocalRef into a function taking const JavaRef&
template <>
class JavaRef {
 public:
  // Initializes a null reference. Don't add anything else here; it's inlined.
  // 初始化一个空引用。不要在此处添加任何其他内容;它是内联的。
  JavaRef() : obj_(nullptr) {}

  // Allow nullptr to be converted to JavaRef. This avoids having to declare an
  // empty JavaRef just to pass null to a function, and makes C++ "nullptr" and
  // Java "null" equivalent.
  // 允许将 nullptr 转换为 JavaRef。这避免了必须声明一个空的JavaRef只是将null传递给函数,并且使		 
  // C++空指针和Java的”null“等价
  explicit JavaRef(std::nullptr_t) : JavaRef() {}

  // Public to allow destruction of null JavaRef objects.
  // 设为Public来允许销毁空JavaRef对象
  // Don't add anything else here; it's inlined.
  ~JavaRef() {}

  jobject obj() const { return obj_; }

  bool is_null() const { return obj_ == nullptr; }

 protected:
  // Takes ownership of the |obj| reference passed; requires it to be a local
  // reference type.
  // 取得|obj|引用传递的所有权,要求他是一个本地引用类型
  // #if DCHECK_IS_ON()
  //  Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON.
  // 实现包含一个DCHECK,在 DCHECK_IS_ON 时实现外联。
  //  JavaRef(JNIEnv* env, jobject obj);
  // #else
  // Don't add anything else here; it's inlined.
  JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {}
  // #endif

  void swap(JavaRef& other) { std::swap(obj_, other.obj_); }

  // The following are implementation detail convenience methods, for
  // use by the sub-classes.
  // 为了被子类使用,以下是实现细节的便捷方法。
  JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj);
  void SetNewGlobalRef(JNIEnv* env, jobject obj);
  void ResetLocalRef(JNIEnv* env);
  void ResetGlobalRef();
  jobject ReleaseInternal();

 private:
  jobject obj_;

  // DISALLOW_COPY_AND_ASSIGN(JavaRef);
};

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5138742.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存