Android JNI 由C/C++本地代码向Java层传递数据
最近做的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层传递数据的更多相关文章
- 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动
1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...
- Android学习笔记(十二)——使用意图传递数据的几种方式
使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...
- Android教程 -04 启动其它Activity,静态工厂设计模式传递数据
视频建议采用超清模式观看, 欢迎点击订阅我的优酷 意图 Intent 一个应用程序肯定不只有一个界面,如何切换到其它界面,只时候就需要启动其它的Activity.启动Activity有多种方式.我在这 ...
- Android通过网页打开App到指定页面并传递数据
首先在 Android Manifest 文件中注册 intent-filter <activity android:name=".MainActivity" android ...
- java接口传递数据的实例
我们要讲E类中的数据变化通知A类,这样通过接口F来实现.具体原理就是E的每次数据改变都让其通知接口:而A类继承接口,所以每次E的调用接口都会触发A类的数据更改事件的触发. 首先创建一个类E: publ ...
- Android基础Activity篇——Intent向下一个活动传递数据
1.向下一个活动传递数据 String data ="bilibilbilbilbili"; Intent intent1=new Intent(this,secondActivi ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Android开发实践:Java层与Jni层的数组传递
转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是 ...
- Android jni/ndk编程一:jni初级认识与实战体验
Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供Java层调用;另外,就拿Android系统中的Service来说,很多的S ...
随机推荐
- 计数排序之python 实现源码
old = [2, 5, 3, 0, 2, 3, 0, 3] new = [0, 0, 0, 0, 0, 0] for i in range(len(old)): new[old[i]] = new[ ...
- 一段sql的优化
优化前代码 select * ,ROW_NUMBER() OVER(order by WrongCount desc) as rowId from(select Quba_IDint,Quba_Num ...
- IOS视图旋转可放大缩小
- (IBAction)hideBut:(id)sender { if (self.flg) { [UIView animateWithDuration:0.3 animations:^{ self. ...
- find命令使用, -exec xargs
find [path] [expression] 例如:find /home -name \*.o -exec rm '{}' \; find: 实时精确,支持众多查找标准,遍历指定目录中 ...
- WORDPRESS插件开发(二)HELLO WORLD改进版
在上一篇文章中WORDPRESS插件开发(一)HELLO WORLD,演示了Hello World的最简单实现,只是在每篇文章的后面加入Hello World字符,而且字符也是写死的. 如果用户需要自 ...
- c#语音
1.新建WinForm程序,项目名称命名为Speech. 2.在COM组件中添加SpeechLib的引用. using SpeechLib;//添加语音引用 添加一个文本框并将其重命名为txtCont ...
- 截获控制台程序关闭事件(SetConsoleCtrlHandler)
最近控制台程序中需要捕获控制台关闭事件,在用户关闭的时候进行某些操作,找了一大圈发现了一个方法,通过调用WIN32 API SetConsoleCtrlHandler方法来实现,具体代码如下: usi ...
- 关于mac上的homebrew
首先它的安装指令并不难: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ ...
- cygwin下的第一次编程记录
今天在window7上安装了cygwin,体验了一把unix,编了个小c,c++程序 先把过程记录下来 1.先删除以前建立的source文件夹 rm -rf source linux删除目录很简单,很 ...
- 黑马程序员-------.net基础知识三
条件执行语句 if 语句 语法: [csharp] view plaincopyprint? if(条件) { 语句1;语句2:语句3: ··· } 执行过程: 先判断条件是否为true ,如果为tr ...