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\realm\realm-jni\build.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.1\README.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是开源的,但是可没说它依赖的关键库也是开源的。。。这个感觉就像遇到某大片宣传全程高清无码,看到关键时刻发现都是马赛克,哈哈哈哈~~~~

 

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

posted @ 2016-05-21 12:55  seebigsea  阅读(385)  评论(1编辑  收藏  举报