【问题标题】:How can i return a jobject if i have a class?如果我有课,我如何返回作业?
【发布时间】:2018-03-04 02:34:56
【问题描述】:

我遇到了返回作业的问题。

我有课:

 class KeyPair  {

        std::vector<BYTE> _publicKey;
        std::vector<BYTE> _privateKey;

    public:
        void SetKeys(std::vector<BYTE> publicKey, std::vector<BYTE> privateKey)
        {
            _publicKey = publicKey;
            _privateKey = privateKey;
        };
    };

和功能:

JNIEXPORT jobject JNICALL function(JNIEnv *env, jobject)
{
    //some code
    KeyPair keyPair;
    keyPair.SetKeys(pub, priv);
    return keyPair;//error
}

如何将 keyPair 作为作业返回?

【问题讨论】:

  • 欢迎来到 JNI。工作流程是定义一个Java类,将一些方法标记为native,运行javac得到一个.class文件,运行javah得到一个.h文件,然后在.h文件的基础上用兼容的语言实现功能。在调用 JNI 函数时,您可能会发现 javap -s 很有用。此外,将 SWiG 和 JNA 视为以相反方向执行工作流的 JNI 工具。 SWiG 可能会在这里为您提供最好的服务。

标签: java c++ java-native-interface


【解决方案1】:

您不能像这样将 C++ 对象转换为 jobjects。

一种方法是定义一个 Java KeyPair 类,该类具有一个 private long ptr 字段,您可以在其中填充一个指向 C++ KeyPair 对象的指针。如果您创建一个使用其参数填充 ptr 字段的单参数构造函数,这会有所帮助。

要创建这样的东西:(另见How to create an object with JNI?

  • 查找与您的 java KeyPair 类 (env-&gt;FindClass) 关联的 jclass。
  • 查找构造函数 (env-&gt;GetMethodId)。
  • 实例化对象 (env-&gt;NewObject)。
  • 最后,返回jobject

如果您以后需要从作为jobject 传递的KeyPair 中提取ptr,则需要查找ptr 的字段ID 并使用env-&gt;GetLongField 来提取它。

【讨论】:

    【解决方案2】:

    你能把错误贴在这里吗? 实际上,你不能返回一个类——它只是没有意义,你总是返回一个对象,即类的一个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 2019-02-19
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多