jni 与java 之间传递bytearray

来源:互联网 发布:手机排队软件 编辑:程序博客网 时间:2024/05/22 02:27

要实现在java 端传递bytearray 到jni 端,同时在jni 端要反馈回bytearray


在java 端的声明如下:

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

如下是jni 端的声明


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

    
  // parse the data
         //below is the return 's bytearray lens

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

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

    return 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);
   // parse the data and process your data
      //try to process the data
              for(i=0;i<len;i++)
              {
                gr_raw_data[i]=bytedata[i]+1;
              }
       //after proces the data, you can return the processed data lens which may be different the raw len
     // note below is the return 's bytearray lens
     jbyteArray jarrRV =env->NewByteArray(len+1);

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

     return jarrRV;
}

//blow is the java to call jni and pass the byte array to jni and return from jni

 public void test(t) {
        // Create temporary object
     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));
        
        }





0 0
原创粉丝点击