博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 下 JNI 开发
阅读量:4046 次
发布时间:2019-05-25

本文共 2326 字,大约阅读时间需要 7 分钟。

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

 

 

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

你可能感兴趣的文章
JVM最简生存指南
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>