Android Studio下的NDK开发(二):参数传递

来源:互联网 发布:淘宝卖东西必须开店吗 编辑:程序博客网 时间:2024/06/05 10:59

1、接口的命名规则

在C中的命名方法,如图:

在java中与之对应的方法是



2、参数

由上面的代码可以看到,在C文件中,getStrng()函数有三个参数

JNIEnv:实际上代表了Java环境,可以通过它访问java中的变量和调用java中的方法;即可以通过它访问JniUntil类里面的内容;

jobject:如果native方法不是static的话,这个obj就代表这个native方法的类实例,如果native方法是static的话,这个obj就代表这个native方法的类的class对象实例;

jstring:对应getString()中的参数String  str,在java中的String类型映射在C里是jstring。

3、java的类型在C/C++中的映射关系

Java类型  本地类型
boolean    jboolean  
byte    jbyte   
char    jchar   
short      jshort    
int       jint     
long    jlong   
float       jfloat  
double   jdouble 
void    void   


4、使用参数

在java中定义一个参数实现加法功能,代码如下

public native int sum(int a,int b);


在C中定义接口,代码如下

JNIEXPORT jint JNICALL Java_com_jnidemo_JniUntil_sum        (JNIEnv * env,jobject obj,jint a,jint b){    return a+b;}

编译好之后将.so文件拷贝到JniLibs中,在main中调用

TextView integer = (TextView) findViewById(R.id.int_text);until = new JniUntil();integer.setText(until.sum(5,7)+"");

运行结果如下:



4、参数传String对象

String在Java中常用的对象,但在C语言中并没有String这种数据类型,想要在C中使用String对象则需要使用到JNIEnv,在C中代码如下:

JNIEXPORT jstring JNICALL Java_com_jnidemo_JniUntil_getString        (JNIEnv * env, jobject obj,jstring str){    //以UTF编码格式将jstrng对象转换成char型    char *a= (*env)->GetStringUTFChars(env, str, 0);    //将char型转换回jstring返回给Java    return (*env)->NewStringUTF(env,a);}

java中代码如下:

public native String getString(String str);

在Activity中调用:

TextView str = (TextView) findViewById(R.id.str_text);until = new JniUntil();str.setText(until.getString("心系一处守口如瓶"));

运行结果:




5、传数组参数

定义一个方法实现将整型数组的所有元素相加,在C中代码如下:

JNIEXPORT jint JNICALL Java_com_jnidemo_JniUntil_sumArray        (JNIEnv *env,jobject obj,jintArray array){    int sum=0;    //获取数组长度    jsize length=(*env)->GetArrayLength(env,array);    //获取数组地址    jint *c_array=(*env)->GetIntArrayElements(env,array,0);        for (int i=0;i<length;i++){        sum=sum+c_array[i];    }    return sum;};

java中代码如下:

public native int sumArray(int array[]);


在Activity中调用:

TextView array = (TextView) findViewById(R.id.array_text);until = new JniUntil();int a[]=new int[]{1,2,3,4,5,6,7,8,9};array.setText(until.sumArray(a)+"");


运行结果:




6、源码链接


https://github.com/Hasagit/JniDemo_II.git