java - 如何直接使用jni将字节数组从c复制到java byte[]属性

标签 java android c arrays java-native-interface

我正在为 android 编写一个带有 jni 的 C 模块。
我的java类是

public class Payment {
    private static Payment payment = null;
    private long nativeObj;
    private byte[] sendBuffer;
    private byte[] recvBuffer;
    private byte[] msg;

    private Payment() {
        this.sendBuffer = new byte[1024];
        this.recvBuffer = new byte[1024];
        this.msg = new byte[1024];
    }

    public native void setArray();

 }

我想在c中填充Payment实例的字节数组,但我做不到。
为此目的jni调用的过程是什么?

我使用

获取 sendBuffer 的字段 id
jclass thisClass = (*env)->GetObjectClass(env, obj);
jfieldID sendId = (*env)->GetFieldID(env, thisClass, "sendBuffer", "[B");

但我不知道如何将数据从 char[1024] 复制到 sendBuffer。

最佳答案

您可以使用类似的方法将数据从 C 复制到 java 字节数组;

jint_Java_com_stack_overflow_copyBytes(JNIEnv *e, jclass obj, jlong p)
{
    jclass thisClass = (*env)->GetObjectClass(e, obj);
    jfieldID sendId = (*env)->GetFieldID(e, thisClass, "sendBuffer", "[B");        
    jbyteArray bytes = (*e)->GetObjectField(e, obj, sendId)

    jbyte* b = (*e)->GetByteArrayElements(e, bytes, NULL);
    memcpy(myCBytes, b, len);
    (*e)->ReleaseByteArrayElements(e, bytes, b, 0);
}

关于java - 如何直接使用jni将字节数组从c复制到java byte[]属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46491144/

相关文章:

c - ")" token 和 C 错误之前的预期表达式错误 - 错误 : expected expression before ']' token

java - 复选框节点树,Swing 中的自定义渲染器

java - 按特定顺序对列表列表进行排序

java - 剥离和替换字符串模式的最优雅的方法

android - 以下代码第一次没有显示 toast 消息

android Facebook :preset_size doesn't exist in xml?

具有不规则 X 轴值的 Android Graph

java - 在 onSaveInstanceState 中保存图像按钮的 isSelected() 属性并恢复它

c - 尝试在 Eclipse 中调试,在 [十六进制数 'No Source Available for "] 处出现错误 ]"' main()

mysql - 如何将 mysql 结果分配给变量(在 C 中)