gpt4 book ai didi

java - 如何使用 Java native 接口(interface)将字节数组传递给以 char* 作为参数的 C 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:36 25 4
gpt4 key购买 nike

所以我需要使用 JNI 从 java 调用 C 函数。当传入不同的数据类型(创建 native 变量、头文件、共享库等等)时,我已经能够成功地做到这一点,但无法让它与字节数组一起工作。这是我的 C 函数:

#include <stdio.h>
void encrypt(int size, unsigned char *buffer);
void decrypt(int size, unsigned char *buffer);

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

这是我的 java 代码(我知道在从中生成头文件后,我必须用头文件中的 JNI 代码替换 C 函数声明)

class Tester{
public native void encrypt(int size, char *buffer);
public native void decrypt(int size, char *buffer);
static{
System.loadLibrary("buffer");
{
public static void main(String[] args){
Tester test = new Tester();
String hello = "hello";
byte[] byteHello = hello.getBytes();
test.encrypt(5,byteHello);
test.decrypt(5,byteHello);
}
}

我知道 char* 类型在 Java 中不受支持,这就是我在尝试编译时遇到错误的原因。也许我应该在 Java 中将类型更改为 char[]?无论如何,我的目标是能够将 Java 中的字节数组传递到我的 C 函数中,遍历字节数组,并打印出每个元素。

最佳答案

Java char和 C char类型不兼容,传递 byte[] 可能会更好到 C,然后按需转换每个元素。


沿着这些线的东西:

主要.java:

//...Code to load library...

public static void main(String[] args) {
passBytes("hello".getBytes());
}

public static native void passBytes(byte[] bytes);

主要.c:

#include "Main.h" // Main.h is generated

JNIEXPORT void JNICALL Java_Main_passBytes
(JNIEnv *env, jclass clazz, jbyteArray array) {
unsigned char* buffer = (*env)->GetByteArrayElements(env, array, NULL);
jsize size = (*env)->GetArrayLength(env, array);

for(int i = 0; i < size; i++) {
printf("%c", buffer[i]);
}

(*env)->ReleaseByteArrayElements(env, array, buffer, JNI_ABORT);
}

jbyteArray只不过是一个 stub 类型,在 jni.h 中定义:

struct _jobject;
typedef struct _jobject *jobject;
typedef jobject jarray;
typedef jarray jbyteArray;

它实际上不包含任何数据。它或多或少只是一个内存地址。

为了从中获取元素,我们将其传递给 GetByteArrayElements (因为类型是 byte[] )这可以要求 VM 检索 C 样式数组中的元素。 (它可能会也可能不会制作副本。请参阅文档)

数组长度也是如此。

告诉虚拟机我们已经完成了阵列。我们调用 ReleaseArrayElements .

此外,jbyte定义为 signed char , 所以只使用 GetByteArrayElements 的结果作为unsigend char*而不是 jbyte*在这种情况下是安全的。

关于java - 如何使用 Java native 接口(interface)将字节数组传递给以 char* 作为参数的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37423867/

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