JNI的ByteArray

时间:2017-03-10 17:44:59

标签: c# c++ android-ndk java-native-interface

如何在clear C中编写android本机库?

我尝试写字节操作NOT。但是获取数组元素会遇到麻烦。

在C#中

private static byte[] NOT(byte[] b1)
    {
        byte[] result = new byte[b1.Length];
        for (int i = 0; i < b1.Length; i++)
        {
            result[i] = (byte)(~b1[i]);
        }
        return result;
    }

在AndroidStudio .cpp中我写道:

static jbyteArray byteNOT(JNIEnv *env,jbyteArray b1)
    {
        int lengthOfArray = env->GetArrayLength(b1);

        jbyteArray ret = env->NewByteArray(lengthOfArray);
        for(int i = 0;i<lengthOfArray;i++){
        ret[i] = ~ ...
    }

我该怎么做?

1 个答案:

答案 0 :(得分:0)

看看这里,获取一个从Java获取数据并将其发回的示例代码。

http://jnicookbook.owsiak.org/recipe-No-013/

在你的情况下,你需要这样的东西:

/* get size of the array */
  jsize len = (*env)->GetArrayLength(env, array);

  /* get the body of array; it will be referecende by C pointer */
  jbyte *body = (*env)->GetByteArrayElements(env, array, 0);

  /* do some stuff */
  for(int i=0; i < len; i++) {
    printf("Byte value: %d\n", body[i]);

    /* update value */
    /* you will make negation here */ 
    body[i] = 0;
  }

  /* release body when you decide it is no longer needed
    Pass changes back to Java */
  (*env)->ReleaseByteArrayElements(env, array, body, JNI_COMMIT);