我有两个非常相似的C函数从python和Java调用。 如何将2个库合并为1个可以从两种语言调用的库?

基本上我有2个C函数“encrypt”的实现,我使用ctypes和java使用JNI从python调用。 我被告知要使用两个用于java和python的动态库,并将它们组合成一个可以从两者中调用的静态库。 为了澄清,这里是使用JNI的Java的C函数实现:

#include "jniTest.h" #include  JNIEXPORT void JNICALL Java_jniTest_passBytes (JNIEnv *env, jclass cls, jbyteArray array) { unsigned char *buffer = (*env)->GetByteArrayElements(env, array, NULL); jsize size = (*env)->GetArrayLength(env,array); for(int i=0; iReleaseByteArrayElements(env, array, buffer, 0); } 

因此,该函数接受一个字节数组,并将每个字节递增1,然后返回新字节数组的每个元素。 这是java方面:

 class jniTest{ public static native void passBytes(byte[] bytes); static{ System.loadLibrary("encrypter"); { public static void main(String[] args){ Tester tester = new Tester(); byte[] b = "hello"; tester.passBytes(b); } } 

C函数的python实现完全相同,只是没有使用所有JNI语法:

 #include  void encrypt(int size, unsigned char *buffer); void encrypt(int size, unsigned char *buffer){ for(int i=0; i < size; i++){ buffer[i]+=1; printf("%c", buffer[i]); } } 

和python方面:

 import ctypes encryptPy = ctypes.CDLL('/home/aradhak/Documents/libencrypt.so') hello = "hello" byteArr = bytearray(hello) rawBytes = (ctyes_c.ubyte*len(byteArr)(*(byteArr)) encryptPy.encrypt(len(byteArr), rawBytes) 

正如您所看到的,python和java的C函数完全相同(很少有细微差别)。 它们接收一个字节数组,每个字节递增1,并打印每个递增的字节。 我只需要将这两个C库结合起来并将它们组合成一个静态库,可以从python和java中访问它们。 这可能吗? 谢谢。

你可以从java中调用python版本。 这避免了重复的代码。 你仍然需要进行JNI编组操作:

 void encrypt(int size, unsigned char *buffer){ for(int i=0; i < size; i++){ buffer[i]+=1; printf("%c", buffer[i]); } } JNIEXPORT void JNICALL Java_jniTest_passBytes (JNIEnv *env, jclass cls, jbyteArray array) { unsigned char *buffer = (*env)->GetByteArrayElements(env, array, NULL); jsize size = (*env)->GetArrayLength(env,array); encrypt(size, buffer); (*env)->ReleaseByteArrayElements(env, array, buffer, 0); }