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语言中实现加法运算

  1. 创建工程DataPassDemo
  2. 创建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目录

 

 

 

  1. 解决C文件报错
  2. 改后缀名为.c和Android.mk文件
  3. 写C代码的加法运算
  4. 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);

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值