• realm-java 源码疑问


    JNIEXPORT void JNICALL Java_io_realm_internal_Group_nativeWriteToFile(
        JNIEnv* env, jobject, jlong nativeGroupPtr, jstring jFileName, jbyteArray keyArray)
    {
        TR_ENTER_PTR(nativeGroupPtr)
        StringData file_name;
        KeyBuffer key(env, keyArray);
        try {
            JStringAccessor file_name_tmp(env, jFileName); // throws
            file_name = StringData(file_name_tmp);
    #ifdef REALM_ENABLE_ENCRYPTION
            G(nativeGroupPtr)->write(file_name, key.data());
    #else
            G(nativeGroupPtr)->write(file_name);
    #endif
        }
        CATCH_FILE(file_name)
        CATCH_STD()
    }
    #define G(x)    reinterpret_cast<realm::Group*>(x)

    Group.java

        /**
         * Serializes the group to the specific file on the disk using encryption.
         *
         * @param file a File object representing the file.
         * @param key A 64 bytes long byte array containing the key to the encrypted Realm file. Can be null if encryption
         *            is not required.
         * @throws IOException.
         */
        public void writeToFile(File file, byte[] key) throws IOException {
            verifyGroupIsValid();
            if (file.isFile() && file.exists()) {
                throw new IllegalArgumentException("The destination file must not exist");
            }
            if (key != null && key.length != 64) {
                throw new IllegalArgumentException("Realm AES keys must be 64 bytes long");
            }
    
            nativeWriteToFile(nativePtr, file.getAbsolutePath(), key);
        }
        public Group() {
            this.immutable = false;
            this.context = new Context();
            this.nativePtr = createNative();
            checkNativePtrNotZero();
        }
    JNIEXPORT jlong JNICALL Java_io_realm_internal_Group_createNative__(
        JNIEnv*,  jobject)
    {
        TR_ENTER()
        Group *ptr = new Group();
        TR("Group::createNative(): %p.", VOID_PTR(ptr))
        return reinterpret_cast<jlong>(ptr);
    }

    CPP代码Group的实现在哪里?

    源码中多次出现的

    #include <realm/util/safe_int_ops.hpp>

    在源码目录中为何找不到?

    没错!这里说的就是 https://realm.io/cn/,下面摘选一下官方的介绍(中文版的介绍让人倍感亲切有木有):

    为什么要使用Realm?
    
    简单易用
    
    Realm并不是一个建立在SQLite之上的ORM,而是一个基于自己的持久化引擎,简单并且快速的面向对象移动数据库。我们的用户们说分分钟就学会了怎样使用Realm,迁移App到Realm也不过只需要花几个小时,方便的Realm为他们省却了数周的开发工作。
    
    跨平台
    
    Realm支持iOS、OS X(Objective‑C和Swift)以及Android。Realm文件可以跨平台共享,让Java、Swift和Objective‑C使用相同的抽象模型访问,从而让您在各个平台上使用尽可能相似的业务逻辑。
    
    快速
    
    得益于zero-copy的设计,Realm比普通的ORM要快很多,甚至比单独无封装的SQLite还要快。请参考iOS benchmark和Android benchmark,或者看看我们的用户们在Twitter上怎么说。
    
    支持
    
    您可以通过以下渠道获得迅速的官方支持:Github、StackOverflow、Twitter、微博。

    本来想看看源码膜拜一下传说中的 zero-copy 是如何实现了,遇上如此难题,只好硬着头皮看编译文件了,在 realm-java-0.90.1 ealm ealm-jniuild.gradle 中出现了如下几行代码:

    import java.security.MessageDigest
    
    ext.coreVersion = '0.100.2'
    
    。。。
    
                download {
                    println "The core addr: http://static.realm.io/downloads/core/realm-core-android-${project.coreVersion}.tar.gz" //楼主添加的打印
                    src "http://static.realm.io/downloads/core/realm-core-android-${project.coreVersion}.tar.gz"
                    dest project.coreArchiveFile
                    onlyIfNewer false
                }

    按照官方 realm-java-0.90.1README.md 所述,大费周折配置好编译环境之后,在cmd执行 gradlew assemble 进行编译,有如下输出:

    看到 http://static.realm.io/downloads/core/realm-core-android-0.100.2.tar.gz ,心中的疑问去了大半,赶紧把链接丢入某雷下载之,打开一看:

    果然!关键实现还是只提供了静态库和头文件啊~~~

    再仔细看看官方(https://realm.io/cn/pricing/)的声明:

    Realm for iOS: 免费($0.00)
    Realm for Android: 免费($0.00)
    本网站发布的Android与iOS的Realm版本均免费——包括应用在商业产品中,没有任何使用或者功能方面的限制。您不需要花一分钱即可使用我们提供的Realm数据库框架。另外realm-cocoa和realm-java均为开源软件,遵守Apache 2.0许可。
    
    我们承诺保持realm-cocoarealm-java在Apache 2.0许可下的开源性,维护它们的可用性,并不断扩展它们的功能。

    realm-java是开源的,但是可没说它依赖的关键库也是开源的。。。这个感觉就像遇到某大片宣传全程高清无码,看到关键时刻发现都是马赛克,哈哈哈哈~~~~

    偷师不成,灰溜溜的说几句酸溜溜的话。。。

  • 相关阅读:
    NSOperation
    iOS 数据持久化方案
    JS高级学习历程-15
    JavaScript进阶
    JavaScript进阶
    JavaScript进阶
    JS高级学习历程-14
    JavaScript进阶
    Linux 添加硬盘并分区
    VxWorks实验八 信号
  • 原文地址:https://www.cnblogs.com/zhhd/p/5514538.html
Copyright © 2020-2023  润新知