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
这是安卓代码的工程,里面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]