z3j6w9 发表于 2017-6-27 09:47:11

Android JNI 环境搭建和通信实现

本帖最后由 z3j6w9 于 2017-6-27 09:59 编辑

      前些日子写了一些驱动,然后就想着通过安卓程序来控制一下,在论坛搜了下jni实现的案例,没怎么看懂,然后就开始了漫长的百度之旅。   
         从我搞jni的过程来看,jni的环境真的是好麻烦(我是在windows上搞的,不知道linux上会不会简单点)。讲一下我参考的文档和遇到的坑,供新手们参考和借鉴,链接如下:
1.http://www.2cto.com/kf/201502/377185.html   eclipse下的安卓jni开发,讲了jni环境的配置,有部分小坑,会在后续说明
2.http://blog.csdn.net/kwiner/article/details/6250021   ndk环境的配置
3.http://www.cnblogs.com/smyhvae/p/4375710.html安卓button的使用示例,由于本人不会安卓,所以代码基本百度,还好学过一点面向对象语言,虽然不会写,看还是看得懂的。

关于遇到的一点小坑:
1.在java中调用jni,链接1中使用的方式为
static {
System.load("TestJNI");
}

我尝试了下,提示找不到,然后做了一点修改,修改如下
static {      


System.load("libTestjni.so");


}
2.编译.so的时候提示找不到jni/jni下的xxx,在jni文件下再创建一个jni文件,然后将那些文件挪过去就好了

3.在dev下创建的设备节点是没有权限的,需要手动修改下权限
提供一个ndk下载的链接,文中的链接不知道为啥我连不上去
https://developer.android.google.cn/ndk/downloads/index.html



z3j6w9 发表于 2017-6-27 09:53:14


这是安卓代码的工程,里面jni涉及到的主要文件我已经圈出来
Testjni.java
package com.gpio.jni;

public class Testjni {
public native int led_off();
public native int led_on();
}com_jni_gpio_Testjni.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "com_gpio_jni_Testjni.h"

JNIEXPORTjintJNICALL Java_com_gpio_jni_Testjni_led_1off
(JNIEnv * env, jobject obj){
        jint res = -1;
        int fd;
        int flag = 1;
        fd = open("/dev/hello",O_RDWR);
        if (fd < 0)
        {
                return res;
        }
        write(fd, &flag, sizeof(flag));

        return 0;
}

JNIEXPORTjint JNICALL Java_com_gpio_jni_Testjni_led_1on
(JNIEnv *env, jobject obj){
        jint res = -1;
        int fd;
        int flag = 0;
        fd = open("/dev/hello",O_RDWR);
        if (fd < 0)
        {
                return res;
        }

        write(fd, &flag, sizeof(flag));

        return 0;
}
com_jni_gpio_Testjni.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_gpio_jni_Testjni */

#ifndef _Included_com_gpio_jni_Testjni
#define _Included_com_gpio_jni_Testjni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:   com_gpio_jni_Testjni
* Method:    led_off
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_gpio_jni_Testjni_led_1off
(JNIEnv *, jobject);

/*
* Class:   com_gpio_jni_Testjni
* Method:    led_on
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_gpio_jni_Testjni_led_1on
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.gpio.gpio_ctrl.MainActivity" >

    <Button
      android:id="@+id/button2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignBaseline="@+id/button1"
      android:layout_alignBottom="@+id/button1"
      android:layout_alignParentRight="true"
      android:layout_marginRight="57dp"
      android:text="LedOff" />

    <Button
      android:id="@+id/button1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentLeft="true"
      android:layout_centerVertical="true"
      android:layout_marginLeft="23dp"
      android:text="LedOn" />

</RelativeLayout>






页: [1]
查看完整版本: Android JNI 环境搭建和通信实现