1、接口的命名规则

在C中的命名方法,如图:
Android Studio下的NDK开发(二):参数传递
在java中与之对应的方法是

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

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

运行结果如下:
Android Studio下的NDK开发(二):参数传递


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("心系一处守口如瓶"));

运行结果:

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


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


运行结果:

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


6、源码链接


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


相关文章: