是否可以使用GCJ编译一个用于Java的库,获取一个dll并从python ctypes调用?
我现在对toxilibs感兴趣,但如果有人知道一个很棒的玩具示例!
答案 0 :(得分:1)
如果你想要Java-Python钩子,你最好还是使用Jython,然后通过这种方式调用边界。
但是,是的,可以从Java调用外部库;但你不需要GCJ那样做。相反,您可以在Python运行时中调出一个JVM实例,然后为此调用您的方法。
基本上,您希望在启动时创建VM,然后随时调用您的方法:
// Do this once per session, e.g. an __init__
JNI_CreateJavaVM(&jvm, &env, &vm_args);
// When needed invoke Example.foo(int)
jclass cls =
env->FindClass("Example"); jmethodID
mid = env->GetStaticMethodID(cls,
"foo", "(I)V");
env->CallStaticVoidMethod(cls, mid,100);
您可以编写一些简单的C-wrapper代码,以便从ctypes中为您调用此代码。但是,JavaVM是一个带有许多void *指针的结构,所以直接做它可能并不重要。