我正在寻找为 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); 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!