2010-02-04 2 views
4

Можно ли скомпилировать библиотеку, предназначенную для Java с GCJ, получить DLL и вызвать из python ctypes?Можно использовать GCJ для создания библиотеки, вызываемой из Python?

На данный момент я заинтересован в токсикологиях, но если кто-нибудь знает игрушечный пример, это было бы здорово!

+0

Можете ли вы использовать Jython? Я совершенно уверен, что это будет намного проще. – zneak

+0

Это было бы, но тогда это сделало бы использование множества библиотек на основе C, которые я могу вызывать из CPython намного сложнее, и оставляю меня с недостатком библиотек. –

ответ

1

Если вы хотите перехватывать Java-Python, вам будет намного лучше использовать Jython, а затем вызывать через границу таким образом.

Однако, да, можно вызвать внешнюю библиотеку из Java; но для этого вам не нужен GCJ. Скорее всего, вы можете просто вызвать экземпляр JVM внутри вашей среды исполнения Python, а затем вызвать для этого свой метод (ы).

JNI invocation spec

В принципе, вы хотите создать виртуальную машину при запуске, а затем вызвать свой метод (ы), когда вы хотите:

// 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-оболочку для вызова этого для вас из ctypes. Тем не менее, JavaVM представляет собой структуру структуры с несколькими указателями void *, поэтому может быть нетривиально делать это напрямую.

+0

Думаю, я мог бы использовать сокет между CPython и Jython и называть его таким образом. Действительно, я хочу иметь в основном программу на языке CPython, но иметь возможность использовать некоторые из библиотек обработки, для графики или звука (например, я ревную к их поверхностной библиотеке). То, как вы опубликовали, наверняка будет работать, мне просто интересно, может ли компиляция lib с GCJ (как в исходном вопросе) быть не проще? –