Android 下 JNI 开发

08_javac之间的数据传递-40

public native int add(int x, int y);

public native String sayHelloInC(String s);

public native int[] arrElementsIncrease(int[] intArray);

1.在C语言中实现加法运算

创建工程DataPassDemo

创建java类JNI

 

public class JNI {

/**

 * 调用C语言实现加法运算

 * @param x

 * @param y

 * @return

 */

public native int add(int x, int y);

public native String sayHelloInC(String s);

public native int[] arrElementsIncrease(int[] intArray);

 

}

 

3、设置函数库名称

 

4、用javah生成头文件,并拷贝头文件到jni目录

 

 

 

解决C文件报错

改后缀名为.c和Android.mk文件

写C代码的加法运算

Java代码中JNI类中加载动态代码库,Java代码使用并运行。

2.在C代码中使用logcat

3.在C语言中实现字符串运算-strcat

JNIEXPORT jstring JNICALL Java_com_atguigu_datapassdemo2_JNI_sayHelloInC

  (JNIEnv *env, jobject obj, jstring jstr){

//把Java端传递过来的字符串,追加:Hell0 from C!!

char* jStr = _JString2CStr(env,jstr);//"zhangsan"

char* cStr = "Hell0 from C!!";

//没有返回值,实际上是吧第二个参数拼接在第一个参数的后面

strcat(jStr,cStr);

 

return (*env)->NewStringUTF(env,jStr);

 

}

 

把一个jstring转换成一个c语言的char* 类型

 

/**

 * 把一个jstring转换成一个c语言的char* 类型.

 */

char* _JString2CStr(JNIEnv* env, jstring jstr) {

 char* rtn = NULL;

 jclass clsstring = (*env)->FindClass(env, "java/lang/String");

 jstring strencode = (*env)->NewStringUTF(env,"GB2312");

 jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");

 jbyteArray barr = (jbyteArray)(*env)->CallObjectMethod(env, jstr, mid, strencode); // String .getByte("GB2312");

 jsize alen = (*env)->GetArrayLength(env, barr);

 jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);

 if(alen > 0) {

rtn = (char*)malloc(alen+1); //"\0"

memcpy(rtn, ba, alen);

rtn[alen]=0;

 }

 (*env)->ReleaseByteArrayElements(env, barr, ba,0);

 return rtn;

}

 

4.在C代码实现数组运算

C语言部分代码

JNIEXPORT jintArray JNICALL Java_com_atguigu_datapassdemo_JNI_arrElementsIncrease

  (JNIEnv *env, jobject obj , jintArray jArray){

//目标:把java传过来的数组,给每一个元素加上10;

 

//得到数组的长度

int length = (*env)->GetArrayLength(env,jArray);

 

//遍历赋值

//数组的地址和数组的首地址一样,得到首地址

// jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);

int*  cArray = (*env)->GetIntArrayElements(env,jArray,JNI_FALSE);

int i=0;

for(i; i < length; i++){

//把每一个元素取出来,在原有的基础上加上10

//取值

*(cArray + i) +=10;//当这个循环执行完毕后,Java中的数组就改变了

}

 

return jArray;

}

 

Java部分代码

/**

 * 应用场景:把图片的颜色矩阵(数组)得到,然后传递个C语言代码,让C语言代码帮我们把颜色矩阵给改了

 * 现在要做的:是给每一个元素加上10

 * @param intArray

 * @return

 */

public native int[] arrElementsIncrease(int[] intArray);

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。