java jni jbyteArray传参给c++

unsigned char* myobfuscate(unsigned char *s) {
    unsigned char key, mod, len;
    int i;
    unsigned char* d;

    key = s[0];
    mod = 0x66;
    len = strlen((const char*)s);
    d = (unsigned char *)malloc(len + 1);

    // zero terminate the string
    memset(d, 0x00, len + 1);

    for (i = 0; i < len; i++) {
        d[i] = s[i] ^ mod;
    }
    d[len] = 0;
    return d;
}

JNIEXPORT jbyteArray JNICALL Java_org_swig_simple_exampleJNI_getdata
  (JNIEnv *env, jclass cls, jbyteArray data)
{
	jbyte* bytedata = (*env)->GetByteArrayElements(env,data, 0);

	jsize  oldsize = (*env)->GetArrayLength(env,data);

	unsigned char* old = (unsigned char*)bytedata;

	unsigned char* bytearr=myobfuscate(old);

	jbyteArray jarray = (*env)->NewByteArray(env,oldsize);

	(*env)->SetByteArrayRegion(env,jarray, 0, oldsize,bytearr);
	return jarray;


}

JNIEXPORT jcharArray JNICALL Java_org_swig_simple_exampleJNI_getdata2
  (JNIEnv *env, jclass cls, jcharArray data)
{
	jchar* chardata = (char*)(*env)->GetCharArrayElements(env,data, 0);
	jsize  oldsize = (*env)->GetArrayLength(env,data);
	unsigned char* old = (unsigned char*)chardata;

	unsigned char* bytearr=myobfuscate(old);

	jbyteArray jarray = (*env)->NewCharArray(env,oldsize);

	(*env)->SetCharArrayRegion(env,jarray, 0, oldsize,bytearr);
	return jarray;


}

package org.swig.simple;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.ScrollView;
import android.text.method.ScrollingMovementMethod;

//simple> swig -java -package org.swig.simple -outdir src/org/swig/simple -o jni/example_wrap.c jni/example.i
public class SwigSimple extends Activity
{
    TextView outputText = null;
    ScrollView scroller = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        outputText = (TextView)findViewById(R.id.OutputText);
        outputText.setText("Press 'Run' to start...\n");
        outputText.setMovementMethod(new ScrollingMovementMethod());

        scroller = (ScrollView)findViewById(R.id.Scroller);
    }

    public void onRunButtonClick(View view)
    {
      outputText.append("Started...\n");
      nativeCall();
      outputText.append("Finished!\n");
      
      // Ensure scroll to end of text
      scroller.post(new Runnable() {
        public void run() {
          scroller.fullScroll(ScrollView.FOCUS_DOWN);
        }
      });
    }

    /** Calls into C/C++ code */
    public void nativeCall()
    {
      // Call our gcd() function
      
      int x = 42;
      int y = 105;
      int g = example.gcd(x,y);
      outputText.append("The greatest common divisor of " + x + " and " + y + " is " + g + "\n");

      // Manipulate the Foo global variable

      // Output its current value
      double foo = example.getFoo();
      outputText.append("Foo = " + foo + "\n");

      // Change its value
      example.setFoo(3.1415926);

      // See if the change took effect
      outputText.append("Foo = " + example.getFoo() + "\n");
      
      // Restore value
      example.setFoo(foo);
      byte[] data=exampleJNI.getdata("test中文fff".getBytes());
      System.out.println(new String(data));
      
      byte[] buffer=new byte[data.length];  
      for (int i = 0; i < data.length; i++) {  
          buffer[i] = (byte) (data[i] ^ 0x66);   
      }  
      System.out.println(new String(buffer));
      
      char[] dd=exampleJNI.getdata2("test中文ddd".toCharArray());
      System.out.println(new String(dd));
      
      char[] bufferdd=new char[dd.length];  
      for (int i = 0; i < dd.length; i++) {  
    	  bufferdd[i] = (char) ((dd[i] ^ 0x66)+'0');   
      }  
      System.out.println(new String(bufferdd));
      
      
      
    }

    /** static constructor */
    static {
        System.loadLibrary("example");
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值