最近做的Android项目需要调用C代码,进行串口通信及与硬件设备通信,因此要用到JNI,其中本地代码需要向Java层返回三个参数,分别为

参数一:int型;

参数二: 通信指令,本地代码中为unsigned char[]型,返回unsigned char[]、int[]都可以,能直接将数据转换为16进制字符串最好(Android界面上要显示的就是数组每一位的16进制值);

参数三:同参数二。

具体的实现方式有两种。

第一种是C代码获取Java属性参数,本地修改参数值。

第二种是将三个参数定义为对象,作为函数返回值返回给Java层。

第二种方法的实现,这里定义了一个对象数组,满足参数二、三的要求,即返回int型数组,而对于参数一来说有些浪费。

Java 代码:

package com.fansen.hellojni;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView; public class MainActivity extends Activity { @SuppressLint("DefaultLocale")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); TextView tv = new TextView(this);
tv.setText( "Hello World!" ); DiskInfo[] infos = stringFromJNI();
for (int i = 0; i < infos.length; i++) {

        Log.i("TAG", "infos[" + i + "].data: " + infos[i].data);
        Log.i("TAG", "infos[" + i + "].value: " + infos[i].value);
        Log.i("TAG", "infos[" + i + "].number: " + infos[i].number);

        }

        setContentView(tv);
} public native DiskInfo[] stringFromJNI(); static {
System.loadLibrary("hello-jni");
} } class DiskInfo{
public int data;
public int value;
public int number;
}

C代码:

#include <string.h>
#include <jni.h> typedef struct{
int data;
int value;
int number;
} DiskInfo; jobjectArray Java_com_fansen_hellojni_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
{
jclass clsDiskInfo = (*env)->FindClass(env, "com/fansen/hellojni/DiskInfo");
jobjectArray infos = (*env)->NewObjectArray(env, , clsDiskInfo, NULL); jfieldID dataID = (*env)->GetFieldID(env, clsDiskInfo, "data", "I");
jfieldID valueID = (*env)->GetFieldID(env, clsDiskInfo, "value", "I");
jfieldID numberID = (*env)->GetFieldID(env, clsDiskInfo, "number", "I");
jmethodID consID = (*env)->GetMethodID(env, clsDiskInfo, "<init>", "()V"); unsigned char send[] = {0xFF,0x1F,0x07,0x08,0x00,0x00,0x01,0x02}; int sendcopy[] = {};
int j;
for(j = ; j <= ; j++){
sendcopy[j] = send[j];  //模拟C代码值变化
} int i;
jobject obj;
for(i = ; i < ; i++){
obj = (*env)->NewObject(env, clsDiskInfo, consID);
(*env)->SetIntField(env, obj, dataID, (jint)i);
(*env)->SetIntField(env, obj, valueID, (jint)sendcopy[i]);
(*env)->SetIntField(env, obj, numberID, (jint)sendcopy[i]);
     (*env)->SetObjectArrayElement(env, infos, i, obj);
  }
  return infos;
}

Android JNI 由C/C++本地代码向Java层传递数据的更多相关文章

  1. 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动

    1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...

  2. Android学习笔记(十二)——使用意图传递数据的几种方式

    使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...

  3. Android教程 -04 启动其它Activity,静态工厂设计模式传递数据

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷 意图 Intent 一个应用程序肯定不只有一个界面,如何切换到其它界面,只时候就需要启动其它的Activity.启动Activity有多种方式.我在这 ...

  4. Android通过网页打开App到指定页面并传递数据

    首先在 Android Manifest 文件中注册 intent-filter <activity android:name=".MainActivity" android ...

  5. java接口传递数据的实例

    我们要讲E类中的数据变化通知A类,这样通过接口F来实现.具体原理就是E的每次数据改变都让其通知接口:而A类继承接口,所以每次E的调用接口都会触发A类的数据更改事件的触发. 首先创建一个类E: publ ...

  6. Android基础Activity篇——Intent向下一个活动传递数据

    1.向下一个活动传递数据 String data ="bilibilbilbilbili"; Intent intent1=new Intent(this,secondActivi ...

  7. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  8. Android开发实践:Java层与Jni层的数组传递

    转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是 ...

  9. Android jni/ndk编程一:jni初级认识与实战体验

    Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供Java层调用;另外,就拿Android系统中的Service来说,很多的S ...

随机推荐

  1. bootstrap实现手风琴功能(树形列表)

    首先把架包拷进项目,然后在页面中引进css,js <script src="js/jquery/jquery-2.1.1.min.js"></script> ...

  2. 【ADO.NET】8、DataSet的使用

    一.DataSet的查询 SqlDataReader 适用于大型数据的读取,它是一条一条的读取,读取出来的数据是存放在服务器上当正在读取数据的时候,突然与服务中断,将无法读取后面的数据DataSet ...

  3. 【转】PHP程序员的技术成长规划

    按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...

  4. Linux文件权限学习总结

    一.用户对文件或目录都有哪些权限? 四种:读.写.执行.没有权限 二.如何表示这四种权限? 如果用十进制数字表示,分别为:4.2.1.0:如果用字符表示,分别为:r.w.x.-.个人觉得,使用chmo ...

  5. .net生成随机验证码图片

    /// <summary> /// 自定义图片验证码函数 /// 该函数将生成一个图片验证码,并将生成的code存放于Session["VerifyCode"]变量内. ...

  6. datatables完整的增删改查

    1.需要指定datatables的ID <button class="btn btn-primary" id="newAttribute">新增证照 ...

  7. h5添加音乐

    http://changziming.com/post-209.html 加入HTML代码,因为是绑定在每一页的右上方(或者其他位置),定位用了fixed,所以在页面底部/body之前加上html代码 ...

  8. workerman安装

    1.workerman安装 workerman是php的一个socket框架,简化了socket编程,已经为很多企业所用,今天在centos的ngix+php下安装了workerman,过程记录如下. ...

  9. Java中的TCP/UDP网络通信编程

    127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...

  10. 13个小技巧帮你征服Xcode

    本文由CocoaChina翻译组成员唧唧歪歪(博客)翻译自David McGraw的博客原文:13 Xcode Tips That Will Help You Conquer Xcode当谈论到iOS ...