我的Python-Java接口,设计合理吗?如何封装JNI函数?
我打算自己写一个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实例中调用。
内置类型
我正在做
JInt
、JShort
、JLont
、JChar
等,作为内置的包装类型。比如:
JInt = JClass('java/lang/Integer') JShort = JClass('java/lang/Short') JString = JClass('java/lang/String')
问题:
- 你觉得这个设计怎么样?
- JNI函数用于调用Java类/对象的方法,都是接受可变数量的参数。在阅读了几个关于从一个函数调用可变参数的函数的主题后,我意识到这是不可能的。
现在,有没有一些函数不接受可变数量的参数,而是接受va_list
或其他什么的?我只需要找到一种方法,从Python在Java中调用一个方法!
1 个回答
11
1. 我对这个设计有什么看法?
你要解决的实际问题并不明确。
那边缘情况、错误处理、向前/向后兼容性、Python/Java中的bug呢?这些虽然不有趣,但对开发稳健的软件来说是必不可少的。
混合两种语言已经够难的,混合三种肯定会更糟。我预计会出现严重的维护和耦合问题。
其实这些问题已经有解决方案了。比如RPC,可以让不同语言的程序互相交流。还有Jython,可以让Java和Python互操作。我相信,Jython甚至可以让你在Java中直接创建Python对象,反之亦然。明确这些现有系统的不足之处,以及你打算如何解决这些不足,会很有帮助。
这里还有一些缺失的内容:
- 包管理
- 隐私
- 接口/抽象类
- 方法解析:重载和重写(尤其是当多个方法匹配时)
- 异常处理
- 类型检查,或者如何从类型错误中恢复
2. 我只需要找到一种方法在Java中调用Python的方法! 那Jython、RPC,或者直接调用可执行文件呢?