我正在寻找为 Java 库创建一个 Nativescript 包装器,以便我可以将它的功能用于 Nativescript 应用程序。似乎没有太多文章详细介绍这一点,并且在 Nativescript 应用程序本身中似乎没有明确的方法来执行此操作,这就是为什么我现在将其作为插件包装器。
我正在努力包含的特定 Java 库是 Libsignal-protocol-java 。我已经克隆了 Nativescript Plugin Seed并将此 Java 库添加为依赖项:
src/platforms/android/include.gradle
android {
}
dependencies {
compile 'org.whispersystems:signal-protocol-android:2.3.0+'
}
然后我找到了包含我尝试在 Java 源中访问的方法的特定包:KeyHelper.generateRegistrationId();
source 。一篇文章提到这是必需的,因为在实例化类和方法时必须指定包。
然后,我按如下方式设置 libsignal-protocol.common.ts
来尝试并使用 native 方法:
src/libsignal-protocol.common.ts
import { Observable } from 'tns-core-modules/data/observable';
export class Common extends Observable {
constructor() {
// does not work
let test1 = new org.whispersystems.libsignal.util.KeyHelper.generateRegistrationId();
// does not work
let test2 = org.whispersystems.libsignal.util.KeyHelper.generateRegistrationId();
console.log(test1);
console.log(test2);
}
}
令我沮丧的是,记录器返回了此错误:
System.err: Error: java.lang.Exception: Failed resolving method generateRegistrationId on class org.whispersystems.libsignal.util.KeyHelper
我不知道现在还能去哪里,我想走这条路,因为为这个很棒的 Java 库创建一个包装器似乎比尝试浏览他们的 javascript 库更安全/更干净,因为它需要某些在其中不可用的功能 native 脚本。
如有任何帮助或建议,我们将不胜感激!为了理智起见,我将收录一些我在这个问题上找到的文章,这些文章帮助我达到了现在的水平。
<小时 />来源
请您参考如下方法:
正如你在源代码中看到的那样generateRegistrationId方法需要一个 boolean 参数。
public static int generateRegistrationId(boolean extendedRange) {
try {
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
if (extendedRange) return secureRandom.nextInt(Integer.MAX_VALUE - 1) + 1;
else return secureRandom.nextInt(16380) + 1;
} catch (NoSuchAlgorithmException e) {
throw new AssertionError(e);
}
}
因此您必须向该方法传递一个 boolean 值,
let test2 = org.whispersystems.libsignal.util.KeyHelper.generateRegistrationId(false);