android串口开发入门之搭建ndk开发环境及第一个jni调用程序

android串口开发入门之搭建ndk开发环境及第一个jni调用程序,第1张

概述前言这几天专门研究了下JNI编程,在网上找了好多资料,不过好多都是以前的,没有更新,而且有的还是错误的,让人不得不吐槽一把。所以觉得自己来一篇,本文将详细介绍关于android搭建ndk开发环境及第一个jni调用程序

前言

这几天专门研究了下JNI编程,在网上找了好多资料,不过好多都是以前的,没有更新,而且有的还是错误的,让人不得不吐槽一把。所以觉得自己来一篇,本文将详细介绍关于androID搭建ndk开发环境及第一个jni调用程序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

一:ndk环境搭建

1:开发环境

我使用的是androID studio 2.3.3版本,搭建ndk开发环境比较简单,打开file----Settings----Appearance&Behavior----System Settings----AndroID SDK,选择SDK Tools,将CMake,LLDB,NDK 前的复选框勾上,点击Apply,然后就是等待ndk下载完成。

@H_502_21@

安装成功后,右键项目----open module setting,AndroID NDK location会自动赋值

@H_502_21@

二:第一个jni程序

1:创建ndk项目

创建ndk项目和普通androID项目有一点区别,需要把Include C++ support前面的复选框勾上,然后直接下一步。但在最后一步,有一个c++下拉框选项,可以根据你的实际情况适当修改,C++ Standard :点击下拉框,可以选择标准 C++,或者选择默认 CMake 设置的 Toolchain Default 选项。Exceptions Support :如果你想使用有关 C++ 异常处理的支持,就勾选它。勾选之后,AndroID Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -fexcetions 标志。Runtime Type information Support :如果你想支持 RTTI,那么就勾选它。勾选之后,AndroID Studio 会在 module 层的 build.gradle 文件中的 cppFlags 中添加 -frtti 标志。

   @H_502_21@

项目创建好后,app下多了一个cpp目录,该目录用于存放c程序的源码,头文件,预编译项目等,androID studio 会默认帮我们创建一个native-lib.cpp文件,该文件已有一个测试方法,结构图如下:

  @H_502_21@

通过上图看到,在External Build files 下面多了一个CMakeLists.txt文件,该文件用于c程序需要生成so文件的配置文件。

cmake_minimum_required(VERSION 3.4.1):这是版本信息,我们不用管它

add_library():这个命令是,通过add.library()定义多个库,CMake会去自动构建他们,一个*.cpp文件对应一个add_library命令.

add_library( # Sets the name of the library.生成so文件的名字,建议和cpp文件同名  native-lib  # Sets the library as a shared library.  SHARED  # ProvIDes a relative path to your source file(s). 需要生成so文件的cpp文件名称  src/main/cpp/native-lib.cpp )

find_library():定位 NDK library 的位置,并将其位置存储在一个变量之中。在构建脚本的其他地方使用这个变量,来代指 NDK library。下面的示例代码将 AndroID-specific log support library 的位置存储到变量 log-lib 中

find_library( # Sets the name of the path variable.    log-lib    # SpecifIEs the name of the NDK library that    # you want CMake to locate.    log )

现在我们来看native-lib.cpp文件,这是as帮我们自动生成好的,返回是一个Hello from C++的字符串。

#include <jni.h>#include <string>extern "C"JNIEXPORT Jstring JNICALLJava_serialport_com_ndkjnIDemo_MainActivity_stringFromJNI(  jnienv* env,jobject  /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str());}

JNIEXPORT Jstring JNICALL 这里的Jstring代表返回值,参数jnienv* env,代表指针,jobject 代表调用这个方法的对像(普通方法是jobject,静态方法是jclass)后面的参数和java类中定义的本地方法对数相对应,方法命名规则:Java_包名_调用jni方法的类名_方法名,androID studio 帮我们生成的程序,activity包名是serialport.com.ndkjnIDemo,类名是MainActivity,方法名是stringFromJNI,所以native-lib.cpp方法名称为Java_serialport_com_ndkjnIDemo_MainActivity_stringFromJNI,其中返回值类型和java数据类型对应如下

@H_502_21@

如果我们需要写多个jni方法,*.cpp格式如下:

//方法一extern "C"JNIEXPORT Jstring JNICALLJava_serialport_com_ndkjnIDemo_MainActivity_test1(  jnienv* env,jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str());}//方法二extern "C"//如果不写extern "C" java是无法调用到这里定义的方法JNIEXPORT Jstring JNICALLJava_serialport_com_ndkjnIDemo_MainActivity_test2(  jnienv* env,jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str());}

最后我们来看自动生成的MainActivity,在onCreate中调用stringFromJNI,然后给文本组件赋值,软件运行参见图一

package serialport.com.ndkjnIDemo;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.Widget.TextVIEw;public class MainActivity extends AppCompatActivity {static {    //native-lib值来自,CMakeLists.txt文件中,add_library命令的第一个参数  System.loadlibrary("native-lib"); }protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); TextVIEw tv = (TextVIEw) findVIEwByID(R.ID.sample_text); tv.setText(stringFromJNI());}public native String stringFromJNI();}

代码都是androID studio自动自成的,所以此处不上传代码,demo运行结果:  

@H_502_21@

参考文章:

Android NDK 开发(五)AndroidStudio 2.2 NDK的开发环境搭建

一天掌握Android JNI本地编程 快速入门

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

您可能感兴趣的文章:详解Android JNI的基本使用(CMake)Android串口开发之使用JNI实现ANDROID和串口通信详解 总结

以上是内存溢出为你收集整理的android串口开发入门之搭建ndk开发环境及第一个jni调用程序全部内容,希望文章能够帮你解决android串口开发入门之搭建ndk开发环境及第一个jni调用程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1143108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存