1

我已经用谷歌搜索了一下,并没有真正找到我的问题的好答案:从本机 jni 代码将错误信​​息传递回 java 的惯用方法是什么?

我通常会选择一个设计并使用它,但是这个代码每 5 毫秒调用一次,(大约),所以我想我会问是否有一种习惯的“干净/高效”的方式来做到这一点。

在我看来,我有四个明显的选择:

  1. 在每次调用时,在 java 中创建一个“错误返回”对象并将其传递给 JNI。如果有问题,本机代码会在此对象中填写错误描述,而 java 代码会在返回时对其进行检查。由于错误并不常见,这会为 GC 清理创建大量对象,其中 99.99% 是不必要的。

  2. 与 #1 类似,在 java 类中创建一些单一的“错误返回”对象,该对象一遍又一遍地传递给每个方法调用。在每次返回的 java 代码中检查它是否有错误。这对我来说似乎很狡猾,但也许这是正确的选择?

  3. 在本机代码中创建一个包含错误描述的对象(如果适用),并将其作为返回值传回给 java.util 。在java中调用之后,检查返回是否为null。这似乎没有#1那么浪费,但似乎有点尴尬。

  4. 只需在 jni 方法上构建一个整数返回值,并传回一个与本机代码的“退出”值相对应的 int。枚举 Java 映射中所有可能的本机退出状态。将返回值与“0”进行比较,并在必要时在此映射中查找错误。这似乎比其他方法更有效,但似乎更笨拙,因为本地代码的更改需要有人返回并更新“错误表”。

我觉得好像我错过了一些明显的东西......那里有一位大师可以提供任何见解吗?

谢谢!

4

2 回答 2

4

抛出 java 异常:http: //java.sun.com/docs/books/jni/html/exceptions.html

于 2009-04-28T02:06:04.547 回答
1

关于您提到的方法:

  1. 正如您所提到的,这会产生很多分配/释放调用。
  2. 如果您有超过 1 个线程调用您的本机代码,则此方法将不起作用。
  3. 这假设您不需要其他任何东西的返回值。还有一个问题是你的错误对象在何时何地被“释放”。
  4. 假设您没有将返回值用于其他任何内容,并且您不需要任何有关错误的“额外”信息,这是一个很好的解决方案。可能的错误不应经常更改,以免在更新 Java 代码时产生问题。

当然,如果您确实需要返回值,并且想要有关实际错误的更多详细信息,则应该使用exceptions

于 2009-04-28T02:13:37.070 回答