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-cocoa和realm-java在Apache 2.0许可下的开源性,维护它们的可用性,并不断扩展它们的功能。
realm-java是开源的,但是可没说它依赖的关键库也是开源的。。。这个感觉就像遇到某大片宣传全程高清无码,看到关键时刻发现都是马赛克,哈哈哈哈~~~~
偷师不成,灰溜溜的说几句酸溜溜的话。。。