最近做的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. C++写一个排列组合小程序

    今天突然想到一个问题,有时候,针对同一个事件有多种反映,特别是游戏AI当中,这种情况下需要采取最适合的方案,哪种方案最适合,可以将每种方案的结果或影响都计算一遍,从而选择最合适的.最基本就是一个排列组 ...

  2. Hack--兼容性测试

    CSS hack由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效 ...

  3. js 的基础知识变量

    什么是变量? 变是一个存储和释放我的数据! 我们用var关键字来声名变量,声名多个变量时用逗号来隔开 在变量没有赋值之前,显示是一个未定义的变量! <script> var a; var ...

  4. jquery右下角返回顶部

    实现的效果也就是,当有滚动条是,滚动条未动或与顶部距离小于多少像素是,返回顶部按钮处于隐身状态,当滚动条与顶部距离大于一定像素时,返回顶部按钮出现,实现点击‘返回按钮’后,从当前位置回到等不位置.要先 ...

  5. ul动态增加li

    --> aaa bbb <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  6. uboot 顶层makefile细节分析

    uboot的源文件众多,学习庞然大物首先找到脊椎--顶层的makfile,逐一破解.但是,uboot的makefile同样是一个庞然大物,所以也要找到它的主线.倘若过分专注部分细节,很难做到把握全局, ...

  7. 关于js小数计算的问题

    在js浮点运算中 var a=0.2-0.1; var b=0.3-0.2; console.log(a==b); 答案是什么呢,很多人可能认为是true,包括我在内,但是当我写出来运行了一下,我被答 ...

  8. Visual Studio Code扩展

    Visual Studio Code扩展 注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一 ...

  9. xmpp 配置数据库 服务器

    一.了解XMPP 协议(标准) XMPP 即时通讯协议 SGIP 短信网关协议 这手机发短信 移动支付和网页支付 0x23232[0,1] 0x23232 0x23232 0x23232 只有协议,必 ...

  10. JS简单仿QQ聊天工具的制作

    刚接触JS,对其充满了好奇,利用刚学到的一点知识,写了一个简单的仿QQ聊天的东西,其中还有很多的不足之处,有待慢慢提高. 功能:1.在输入框中输入内容,点击发送,即可在上方显示所输入内容. 2.点击‘ ...