Java codepackage xxxxxxx.xx;import android.app.Activity;import android.os.Bundle;import android.util.Log;public class I2cRadioTest extends Activity { private static final String TAG = "I2cRadioTest"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int[] buf = new int[4]; int slaveAddr = 0xXX; int fileHander; int mode = 0xXX | 0xXX; int i; I2c i2c = new I2c(); fileHander = i2c.open("/dev/i2c-1"); i2c.read(fileHander, slaveAddr, buf, 4); Log.w(TAG, "buf0= " + Integer.toHexString(buf[0]) + " buf1= " + Integer.toHexString(buf[1]) + " buf2= " + Integer.toHexString(buf[2]) + " buf=3 " + Integer.toHexString(buf[3])); buf[0] = 0x01; i = 0;// i2c.write(fileHander, slaveAddr, mode, buf, 1); Log.w(TAG, "write length " + i); for (int j = 0; j < 4; j++) { buf[i] = 0; } i2c.read(fileHander, slaveAddr, buf, 4); Log.w(TAG, "buf0= " + Integer.toHexString(buf[0]) + " buf1= " + Integer.toHexString(buf[1]) + " buf2= " + Integer.toHexString(buf[2]) + " buf=3 " + Integer.toHexString(buf[3])); i2c.close(fileHander); if ((buf[0] & 0x10) == 0x01) { Log.w(TAG, "------success-----"); } else { Log.w(TAG, "----fail-------"); } setContentView(R.layout.main); }}Java codepackage xxxxxx.xxx;/** * This is a I2C operation class */public class I2c { /** * @param nodeName * node path name * @return return file hander else return <0 on fail */ public native int open(String nodeName); /** * @param fileHander * @param i2c_adr * slave addr * @param buf * @param Lenth * of buf * @return read length */ public native int read(int fileHander, int i2c_adr, int buf[], int Length); /** * @param fileHander * @param i2c_adr * slave addr * @param sub_adr * sub addr * @param buf * @param Lenth * of buf * @return write length */ public native int write(int fileHander, int i2c_adr, int sub_adr, int buf[], int Length); public native void close(int fileHander); static { System.loadLibrary("test-i2c"); }}C/C++ code/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class xxxxxx_xxx_I2c */#include <stdio.h>#include <android/log.h>#include <fcntl.h>#include <linux/i2c.h>#include <memory.h>#include <malloc.h>#ifndef _Included_xxxxxx_xxx_I2c#define _Included_xxxxxx_xxx_I2c#ifdef __cplusplusextern "C" {#endif/* * Class: xxxxxx_xxx_I2c * Method: open * Signature: (Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_open (JNIEnv *, jobject, jstring);/* * Class: xxxxxx_xxx_I2c * Method: read * Signature: (II[II)I */JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_read (JNIEnv *, jobject, jint, jint, jintArray, jint);/* * Class: xxxxxx_xxx_I2c * Method: write * Signature: (III[II)I */JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_write (JNIEnv *, jobject, jint, jint, jint, jintArray, jint);/* * Class: xxxxxx_xxx_I2c * Method: close * Signature: (I)V */JNIEXPORT void JNICALL Java_xxxxxx_xxx_I2c_close (JNIEnv *, jobject, jint);#ifdef __cplusplus}#endif#endifC/C++ code#include "test-i2c.h"#define LOG_TAG "i2c"#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_open (JNIEnv *env, jobject obj, jstring file) { char fileName[64]; const jbyte *str; str = (*env)->GetStringUTFChars(env, file, NULL); if (str == NULL) { LOGI("Can't get file name!"); return -1; } sprintf(fileName, "%s", str); LOGI("will open i2c device node %s", fileName); (*env)->ReleaseStringUTFChars(env, file, str); return open(fileName, O_RDWR); } JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_read (JNIEnv * env, jobject obj, jint fileHander, jint slaveAddr, jintArray bufArr, jint len) { jint *bufInt; char *bufByte; int res = 0, i = 0, j = 0; if (len <= 0) { LOGE("I2C: buf len <=0"); goto err0; } bufInt = (jint *) malloc(len * sizeof(int)); if (bufInt == 0) { LOGE("I2C: nomem"); goto err0; } bufByte = (char*) malloc(len); if (bufByte == 0) { LOGE("I2C: nomem"); goto err1; } (*env)->GetIntArrayRegion(env, bufArr, 0, len, bufInt); res = ioctl(fileHander, I2C_SLAVE, slaveAddr); if (res != 0) { LOGE("I2C: Can't set slave address"); goto err2; } memset(bufByte, '\0', len); if ((j = read(fileHander, bufByte, len)) != len) { LOGE("read fail in i2c read jni i = %d buf 4", i); goto err2; } else { for (i = 0; i < j ; i++) bufInt[i] = bufByte[i]; LOGI("return %d %d %d %d in i2c read jni", bufByte[0], bufByte[1], bufByte[2], bufByte[3]); (*env)->SetIntArrayRegion(env, bufArr, 0, len, bufInt); } free(bufByte); free(bufInt); return j;err2: free(bufByte);err1: free(bufInt);err0: return -1; } JNIEXPORT jint JNICALL Java_xxxxxx_xxx_I2c_write (JNIEnv *env, jobject obj, jint fileHander, jint slaveAddr, jint mode, jintArray bufArr, jint len) { jint *bufInt; char *bufByte; int res = 0, i = 0, j = 0; if (len <= 0) { LOGE("I2C: buf len <=0"); goto err0; } bufInt = (jint *) malloc(len * sizeof(int)); if (bufInt == 0) { LOGE("I2C: nomem"); goto err0; } bufByte = (char*) malloc(len + 1); if (bufByte == 0) { LOGE("I2C: nomem"); goto err1; } (*env)->GetIntArrayRegion(env, bufArr, 0, len, bufInt); bufByte[0] = mode; for (i = 0; i < len; i++) bufByte[i + 1] = bufInt[i]; res = ioctl(fileHander, I2C_SLAVE, slaveAddr); if (res != 0) { LOGE("I2C: Can't set slave address"); goto err2; } if ((j = write(fileHander, bufByte, len + 1)) != len + 1) { LOGE("write fail in i2c"); goto err2; } LOGI("I2C: write %d byte", j); free(bufByte); free(bufInt); return j - 1;err2: free(bufByte);err1: free(bufInt);err0: return -1; } JNIEXPORT void JNICALL Java_xxxxxx_xxx_I2c_close (JNIEnv *env, jobject obj, jint fileHander) { close(fileHander); }