2009-07-30 68 views
0

比方说,我甲肝:何时重新编译JNI绑定和客户端代码?

  1. C库libfoo
  2. JNI绑定的包org.foo.jnilibfoo,并
  3. 一个客户端代码包com.user.of.foo

显然,如果org.foo.jni触摸在libfoo变化,我需要重新编译在org.foo.jni类的功能。而且,很明显,如果com.user.of.foo涉及org.foo.jni更改的方法,我需要重新编译com.user.of.foo中的类。但是......

  • 如果我改变libfoo修复错误,但不改变接口,我必须重新编译org.foo.jni类?
  • 如果我将界面更改为libfoo,但仅限于未从org.foo.jni调用的函数,是否必须重新编译org.foo.jni中的类?
  • 如果由于libfoo中的某些更改而导致org.foo.jni中的类重新编译,但不要将界面更改为org.foo.jni,那么是否需要重新编译com.user.of.foo中的类?

回答

3

如果我改变libfoo的修复一个bug,但 不改变接口,我必须 重新编译 org.foo.jni类?

否。如果接口没有改变,那么java代码/接口代码不需要重新编译。这是JNI代码功能的一部分 - 接口可以保持不变,而底层系统特定的实现可以改变。

如果我更改为libfoo时, 但只有在没有从 org.foo.jni调用的函数接口,我要在org.foo.jni重新编译 类?

无论你是否必须,你应该,国际海事组织。这些类可能会工作,但如果你错了,你会得到一个异常(UnimplementedMethod例外,IIRC)

如果我重新编译的类中 org.foo.jni因为 libfoo的一些变化,但不要将接口 更改为org.foo.jni,是否必须重新编译 com.user.of.foo中的类?

不,您的第一个问题出于同样的原因。界面的要点是两者是分开的问题,可以分开开发和编译。

思考JNI的一种方法是使用串口的例子。串行端口的底层实现必须遵循接口,并且来自Java的调用必须遵守接口。两者可以单独开发(实际上几乎总是)并且在不同的时间开发。如果界面更改,则两者都必须更改为更新到新界面。

希望有所帮助。

相关问题