gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:00:38 25 4
gpt4 key购买 nike

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

#include "jniTest.h"
#include <stdio.h>

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; i<size; i++){
buffer[i] += 1;
printf("%c",buffer[i]);
}
(*env)->ReleaseByteArrayElements(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 <stdio.h>

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);
}

关于java - 我有两个非常相似的 C 函数被 python 和 Java 调用。如何将 2 个库合并为 1 个可以从两种语言调用的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37489128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com