基本上我有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); }
以上就是c/c++开发分享我有两个非常相似的C函数从python和Java调用。 如何将2个库合并为1个可以从两种语言调用的库?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519462.html