Android 下 JNI 开发
08_java与c之间的数据传递-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)了解更多。