对于android 调用底层c或者c++,对于才接触的android人来说,还是很吃力的。

这里我做了一个基于android studio 2.2的ndk开发过程,使用底层串口通信

首先我们需要android studio (2.2或者其他支持ndk的版本)

一,打开我们的android studio,在左上角的file目录下找到Setting,进入Setting设置 ,在搜索框中输入sdk

Android NDK 使用_第1张图片


我们可以看到右侧的展示界面中第二个选项SDK Tools,下找到NDK,勾选上,点击ok,之后让android studio,下载更新ndk,android studio的准备工作也就完成了

二. 上图有个目录,ndk的下载路径也就在我们的sdk路径下,我们准备配置ndk的环境变量

右键我的电脑,找到高级系统设置,打开后有个环境变量配置,点击,在系统环境变量里添加如下图所示的系统变量,值为ndk的路径(注意到ndk-bundle目录,后面没有;)

Android NDK 使用_第2张图片

打开系统变量中的path,添加刚刚新建的系统变量

Android NDK 使用_第3张图片

这时ndk的环境变量也配置完成了,我们测试一下,win+r建打开cmd命令,输入ndk-build有如下的输入,则配置正确,

或者输入cd 到ndk-bundle的目录下,在输入nuk-build,也是如下的输出(使用这种方式,不用配置ndk的环境变量)

三.  在android studio的项目中,添加调用ndk的权限,不是在MainXml中,而是在如下图所示的gradle.properties文件下添加android.useDeprecatedNdk=true,

如果忘记添加调试会提示没有权限读写

Android NDK 使用_第4张图片

然后新建SerialPort.java,此文件在网上有很多的串口demo我就不详细说明了,值所

package ceshi.zi.com.serialport;import android.util.Log;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class SerialPort {   private static final String TAG = "zy";   private FileDescriptor mFd;   private FileInputStream mFileInputStream;   private FileOutputStream mFileOutputStream;   public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {      if (!device.canRead() || !device.canWrite()) {         try {            Process su;            su = Runtime.getRuntime().exec("/system/bin/su");            String cmd = "chmod 777 " + device.getAbsolutePath() + "\n"                  + "exit\n";            su.getOutputStream().write(cmd.getBytes());            if ((su.waitFor() != 0) || !device.canRead()                  || !device.canWrite()) {               throw new SecurityException();            }         } catch (Exception e) {            e.printStackTrace();            throw new SecurityException();         }      }      mFd = open(device.getAbsolutePath(), baudrate, flags);      if (mFd == null) {         Log.e(TAG, "native open returns null");         throw new IOException();      }      mFileInputStream = new FileInputStream(mFd);      mFileOutputStream = new FileOutputStream(mFd);   }   public InputStream getInputStream() {      return mFileInputStream;   }   public OutputStream getOutputStream() {      return mFileOutputStream;   }   // JNI native 是访问底层的声明,open方法可能不是点击进入,因为在c中使用
       private native static FileDescriptor   open(String path   , int baudrate   , int flags)   ;    public native void    close()   ;   
   // serial_port 是我们要使用的.so庫的名字(so庫后面我们会编译)   static {      System.loadLibrary("serial_port");   }}


新建号以后,我们在Build下,Build project ,从project的目录下,生成.class文件,没有则代码有错误Android NDK 使用_第5张图片


然后打开android studio的Terminal,输入cd app/build/intermediates/classes/debug ,回车

在输入 javah -jni SerialPort.java文件所在的包.java文件名字,如:

     ceshi.zi.com.serialport. SerialPort

在上图同样的途径下,会生成.h的文件ceshi_zi_com_serialport_SerialPort.h

在下图的方式new一个 Jni,全部默认设置,会在目录下project目录下生成jni目录,android目录下生成cpp目录,将.h文件复制到cpp中

Android NDK 使用_第6张图片


此处止写了一半,后续请下载

http://download.csdn.net/detail/qq_21751781/9784044

谢谢

更多相关文章

  1. android studio 导入.so文件
  2. Android DexClassLoader动态加载类文件
  3. Android ProgressBar自定义图片进度,自定义渐变色进度条
  4. Android中使用imageviewswitcher 实现图片切换轮播导航的方法
  5. Android 原始资源文件的使用详解

随机推荐

  1. android使用App Link或者URL Scheme直接
  2. android Immutable bitmap passed to Can
  3. Ubuntu Android Studio环境搭建
  4. Android 使用Wake Lock
  5. android Binder机制研究一
  6. Android(安卓)记键盘弹起的几个方法
  7. Android Layout 布局 && Android自带样式
  8. [置顶] ANDROID实现IPHONE风格的PICKER
  9. android studio 多渠道打包
  10. Android(安卓)EditText文本输入框禁止输