【问题标题】:JNI Pass By Reference, Is it Possible?JNI通过引用传递,有可能吗?
【发布时间】:2023-03-28 17:00:01
【问题描述】:

我有一个调用 C++ 程序来验证用户身份的 Java 程序。我希望程序返回 true 或 false,如果为 false,则更新指向错误消息变量的指针,然后我可以从 Java 程序中获取该变量。

另一种解释:

本机方法看起来像这样:

public native String takeInfo(String nt_domain, String nt_id, String nt_idca, String nt_password, String &error);

我会在这里调用该方法:

boolean canLogin = takeInfo(domain, userID, "", userPass, String &error)

然后在我的 C++ 程序中,我会检查用户是否经过身份验证并将其存储在布尔值中,如果为 false,则获取错误消息并使用它更新 &error。然后将该布尔值返回给我的 Java 程序,在那里我可以显示错误或让用户通过。

有什么想法吗?

最初我有它,所以程序将返回“true”或错误消息,作为 jstring,但我的老板希望如上所述。

【问题讨论】:

    标签: java c++ java-native-interface pass-by-reference


    【解决方案1】:

    有一种常用的技术是通过在参数中使用对象数组来模拟附加输出参数。

    例如。

    public native String takeInfo(String nt_domain, String nt_id, String nt_idca, String nt_password, String[] error);
    
    boolean canLogin = takeInfo(domain, userID, "", userPass, error);
    if(!canLogin){
       String message = error[0];
    }
    

    还有另一种方法是返回结果对象

    class static TakeInfoResult{
       boolean canLogon;
       String error;
    }
    TakeInfoResult object = takeInfo(domain, userID, "", userPass);
    

    在第二种情况下,您将需要在 JNI 层中进行更多编程。

    【讨论】:

    • 谢谢,我需要在本机 (C++) 代码中做什么才能用错误消息更新“错误”?
    • 准备你的 String 对象,并将其分配到数组中
    【解决方案2】:

    如果你的场景和你描述的一样简单,为什么不只为“真”情况返回 NULL(即使这通常与你所期望的相反)并在出现问题时返回一个指向错误结构的指针错了吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-22
      • 2010-12-17
      • 2015-03-12
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2015-09-15
      • 2014-08-22
      相关资源
      最近更新 更多