我的Python-Java接口,设计合理吗?如何封装JNI函数?

6 投票
1 回答
542 浏览
提问于 2025-04-17 05:59

我打算自己写一个Python和Java之间的接口。这个接口会被编译成一个DLL文件,并使用ctypes来包装。

虽然可以找到Java类并分配Java对象,但如果不使用这些对象的方法,另一个语言的接口又算什么呢?我的目标是让这个过程尽可能自然。不过,遗憾的是,仅仅通过名称是无法找到Java方法的。

我的设计模型如下:

JClass

  • 这个类的实例代表一个Java类。

JObject

  • 这个类的实例代表一个Java对象。它需要用一个JClass实例来初始化。(当然,之后构造函数也应该有参数。)

JMethod

  • 代表一个Java对象的方法。它包含所需方法的名称和签名。签名会在初始化时动态评估。

    举个例子:

    mainMethod  = JMethod('main', JStringArray)
    

    注意,JStringArray是一个JClass的实例,代表一个字符串数组。

    一个JMethod可以添加到JClass实例中,但只能从一个已实例化的JObject中调用。

JStaticMethod

  • 和JMethod类似,但它也可以从JClass实例中调用。

内置类型

  • 我正在做JIntJShortJLontJChar等,作为内置的包装类型。

    比如:

    JInt    = JClass('java/lang/Integer')
    JShort  = JClass('java/lang/Short')
    JString = JClass('java/lang/String')
    

问题:

  1. 你觉得这个设计怎么样?
  2. JNI函数用于调用Java类/对象的方法,都是接受可变数量的参数。在阅读了几个关于从一个函数调用可变参数的函数的主题后,我意识到这是不可能的。
    现在,有没有一些函数不接受可变数量的参数,而是接受va_list或其他什么的?我只需要找到一种方法,从Python在Java中调用一个方法!

1 个回答

11

1. 我对这个设计有什么看法?

  • 你要解决的实际问题并不明确。

  • 那边缘情况、错误处理、向前/向后兼容性、Python/Java中的bug呢?这些虽然不有趣,但对开发稳健的软件来说是必不可少的。

  • 混合两种语言已经够难的,混合三种肯定会更糟。我预计会出现严重的维护和耦合问题。

  • 其实这些问题已经有解决方案了。比如RPC,可以让不同语言的程序互相交流。还有Jython,可以让Java和Python互操作。我相信,Jython甚至可以让你在Java中直接创建Python对象,反之亦然。明确这些现有系统的不足之处,以及你打算如何解决这些不足,会很有帮助。

这里还有一些缺失的内容:

  • 包管理
  • 隐私
  • 接口/抽象类
  • 方法解析:重载和重写(尤其是当多个方法匹配时)
  • 异常处理
  • 类型检查,或者如何从类型错误中恢复

2. 我只需要找到一种方法在Java中调用Python的方法! 那Jython、RPC,或者直接调用可执行文件呢?

撰写回答