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");
}
}