1. ホーム
  2. Android

jniとjavaの間でbytearrayを受け渡しする

2022-02-08 01:23:34

java 側から jni 側へ bytearray を渡し、jni 側で bytearray を返す。


java側の宣言は以下の通りです。

  public native byte[] Bluetooth_NativeProcessData_Send(byte[] data,int len);
  public native byte[] Bluetooth_NativeProcessData_Receive(byte[] data,int len);

以下は、jni側の宣言です。


静的なJNINativeMethod gMethods[] = {。 <未定義
{"Bluetooth_NativeProcessData_Send","([BI)[B",(void*)Native_ProcessData_Send},
{"Bluetooth_NativeProcessData_Receive","([BI)[B",(void*)Native_ProcessData_Receive},
};

jni側での実装。

jbyte gs_raw_data[256];
jbyte gr_raw_data[256];

JNIEXPORT jbyteArray JNICALL Native_ProcessData_Send(JNIEnv *env, jobject clazz, jbyteArray data,jint len)
{ <未定義

  jclass cls;
  int i;
  cls = env->FindClass(JNIREG_CLASS);
  jbyte* bytedata = env->GetByteArrayElements(data, 0);

      memset(&gs_raw_data,0,255);
      memcpy(&gs_raw_data,bytedata,len) を実行します。


  // データを解析する
         //以下は、return 's bytearray lensです。

    jbyteArray jarrRV =env->NewByteArray(len+1);

    env->SetByteArrayRegion(jarrRV, 0,len,gs_raw_data);

    jarrRVを返します。
}


JNIEXPORT jbyteArray JNICALL Native_ProcessData_Receive(JNIEnv *env, jobject clazz, jbyteArray data,jint len)
{ <未定義
 jclass cls;
   int i;
   cls = env->FindClass(JNIREG_CLASS);
   jbyte* bytedata = env->GetByteArrayElements(data, 0);

       memset(&gr_raw_data,0,255);
       memcpy(&gr_raw_data,bytedata,len);
   // データを解析し、データを処理する
      // データを加工してみる
              for(i=0;i<len;i++)
              { <未定義
                gr_raw_data[i]=bytedata[i]+1;
              }
       //データを処理した後、処理したデータレンズを返すことができます。
     // 以下は、return 's bytearray lensであることに注意してください。
     jbyteArray jarrRV =env->NewByteArray(len+1);

     env->SetByteArrayRegion(jarrRV, 0,len,gs_raw_data);

     jarrRVを返します。
}

//blowはjniを呼び出し、バイト配列をjniに渡してjniから返すjavaです

 public void test(t) { <未定義
        // テンポラリオブジェクトの作成
     int ilength,i;
     byte[] retdata;
     byte[] out1 = new byte[1024]です。
        { <未定義
         out1[0] = (byte) 0X31;
         out1[1] = (byte) 0X32;
         out1[2] =0x33。
         out1[3] =0x34。
         out1[4] = 0x35;
        }
        retdata=Bluetooth_NativeProcessData_Send(out1,5);
        { <未定義
         Log.d(TAG,"THE rawdata IS----"+bytesToHex(out1,5));
         Log.d(TAG,"THE RETDATA IS---"+bytesToHex(retdata,5)) を実行します。
        }