1,NDK是什么?为什么要进行NDK开发?

NDK:Native Development Kit。Android应用运行在Dalvik虚拟机中。NDK允许开发人员使用本地代码语言(例如C和C++)实现应用的部分功能。这样以代码重用的形式能够给某类应用提供方便,而且在某些情况下能提高运行速度。

  在实际开发中,那为什么要学习JNI,JNI会学习到比较底层的东西,java可以实现上层应用的开发,但是不能写底层驱动,有些android项目必须和底层硬件打交道,比如要精确快速的获取某种传感器的值,那么java是不能办到的,那怎么办,就通过JNI开发,通过c/c++完成底层驱动或者值得获取,然后将值传回到java层。同样java层也可以将数据传递给c/c++层,这样通过JNI完成数据的交互。常见的产品如蓝牙、运动手环等。

2,NDK环境搭建

  在Android studio2.2之后就可以使用我们的Android开发工具来开发了

  • 安装NDK

  Tools->Android->SDK Manager->SDK Tools选中CMake和NDK,点击确认,软件会自动安装NDK。

  • 将NDK添加到Android Studio环境中

  配置环境变量,方便cmd中的操作,在环境变量Path添加ndk目录

  在cmd中检查是否安装成功,输入ndk-build,出现如下效果即

  ok,环境安装好了我们来创建项目,和我们创建Android工程类似,只不过我们要勾选“include c/c++”

  一路Next ,最后创建项目,创建项目之后我们坑定有些文件没有见过,首先看一下native-lib.cpp类

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

  什么?一脸懵逼!嗯,我现在也和你一样,不过我们查查网上的资料来看看里面的代表什么意思

其中extern “C” 是表示可以供外部调用。
jstring是返回值,maxFromJNI是Java代码中定义的函数。(过会儿会写在MainActivity里,一般是Java_包名_使用地方的类名_方法名)
Java_com_qianmo_ndktest_MainActivity_这一段是调用这个函数的java类以及它所在的包。
JNIEnv* env 和 jobject object是啥我也不知道,很显然这俩必须要用,貌似第一个代表的是什么指针什么的,后面以object类型命名的猜测可能是对象吧(手动微笑)。

  继续看我们Activity中调用

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI()); } /**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI(); }

  我们继续看看让我们懵逼的几个不熟悉的方法

//加载这个native-lib里的函数和东西
static {
System.loadLibrary("native-lib");
}
//这就是对应的c++文件中的方法了
public native String stringFromJNI();

  CMakeLists.txt,等等,这怎么生成了一个txt文件呢?,我们看一看里面的内容

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.4.1) # Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK. add_library( # Sets the name of the library.
native-lib # Sets the library as a shared library.
SHARED # Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp ) # Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build. 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 ) # Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries. target_link_libraries( # Specifies the target library.
native-lib # Links the target library to the log library
# included in the NDK.
${log-lib} )

  继续懵逼,不过我们有搜索引擎,来看看里面的一些语句到底代表什么

# 指定cmake最低版本,如果不知道就复制吧
cmake_minimum_required(VERSION 3.4.1) # 第一个native-lib是供java调用的文件, SHARED 表示将代码编译成动态库即so库,相对 的还有一个STATIC表示静态
# 最后俩是所有cpp的名字和相对本文件的位置,这里在一个文件夹中就直接写名字了,文件有多少写多少
add_library(native-lib SHARED native-lib.cpp Max.cpp) # 我的理解是java要连接到native-lib,和一些其它的东西
target_link_libraries(native-lib)

  OK,上面把基本的一些意思读懂了,那么我们就依葫芦画瓢,仿照着写一个试试呗,首先创建NDKUtils.java类,添加c++方法getStringFromC,添加hello-jin.cpp文件导入,代码如下:

public class NDKUtils {

    static {
System.loadLibrary("hello-jni");//导入生成的链接库文件
} public staticnative String getStringFromC(); }

  继续我们创建hello-jin.cpp文件,并创建 getStringFromC()方法,代码如下:

#include <jni.h>
#include <string> extern "C"
JNIEXPORT jstring JNICALL
Java_com_qianmo_ndktest_NDKUtils_getStringFromC(
JNIEnv *env,
jobject /* this */) {
std::string hello = "这里是来自与c++";
return env->NewStringUTF(hello.c_str());
}

  在CMakeLists.txt文件中添加java和c++文件的链接

add_library(hello-jni SHARED src/main/cpp/hello-jni.cpp)

target_link_libraries(hello-jni)

  ok,这样我们就写完了,看一下我们运行的效果

  OK,今天就给大家分享简单的NDK环境搭建和简单的数据获取,由于我自己也不怎么会写c/c++文件(都忘光了),所以后面我边学习边给大家继续分享NDK开发知识(有好的NDK开发知识的同学求共享呀,谢了啊)

Android -- Android下的NDK开发(一)的更多相关文章

  1. android studio下的NDK开发详解(一)

    源地址:http://www.voidcn.com/blog/chengkaizone/article/p-5761016.html 好记性不如烂笔头,开始坚持写博客,学一点记一点,只为了生活更好. ...

  2. 在Android studio中进行NDK开发

     在Android studio中进行NDK开发  分类: Android平台 软硬件环境 ubuntu kylin 14.04 红米note增强版 Android studio 0.8.6 ndk ...

  3. 在Android平台下搭建PhoneGap开发环境--用HTML5开发游戏

    一.在Android平台下搭建PhoneGap开发环境具体怎么搭建我这里就不详细说了,如有需要我后面再讲 . PhoneGap 官方地址有详细说明:http://www.phonegap.com. 在 ...

  4. Android Studio 2.2 NDK开发环境搭建

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52763192 本文出自: [HansChen的博客] Android应用程序使用ND ...

  5. Android Studio下使用NDK的流程

    我要重新拿回持之以恒徽章!! 老规矩,先说看能学会什么:ANDROID STUDIO下NDK的使用方法.JNI的基本使用方法,C语言调用JAVA的方法. 首先要下载NDK,如果你没有VPN可以来htt ...

  6. android -------- Eclipse下的NDK配置环境

    NDK 全称是Native Development Kit,是一个让开发人员在Android应用中嵌入使用本地代码编写的组件的工具集 原生开发工具包 (NDK) 是一组可让您在 Android 应用中 ...

  7. Android使用的Eclipse NDK开发较详细一篇文章

    转自: http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html

  8. Android studio 下的 NDK 配置方法和注意事项

    http://blog.csdn.net/u013598660/article/details/47341963

  9. 【转】windows下 ADT NDK开发环境配置

    前提: 下载好Ecplise ADT并配置好开发环境,不会配置环境可以参考这里: http://blog.csdn.net/danfengw/article/details/47111107 步骤: ...

随机推荐

  1. 赵本山 教你如何在实战项目中使用WCF

    我们都知道调用WCF直接在Service References中引用可以远程调用的WCF Url就行了. 但是我们想过没,在Development环境中可以这样做,但是QA.UAT.Productio ...

  2. TypeScript设计模式之策略、模板方法

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  3. Spring IOC以及三种注入方式

    IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...

  4. 用GDB调试程序

    转自:http://blog.csdn.net/haoel/article/details/2879 是一篇从基础讲gdb的博文 用GDB调试程序 GDB概述---- GDB是GNU开源组织发布的一个 ...

  5. Castle Windsor 学习-----Installer的几种安装方式

    翻译 当使用依赖注入容器时,你首先要向容器中注册你的组件,Windsor使用installers(该类型实现IWindsorInstaller接口)来封装和隔离注册的逻辑,可以使用Configurat ...

  6. Java基础——第一个记事本代码与Java注释

    一 .使用记事本编辑java文件: 1.打开记事本,重命名文件名,文件拓展名“.java”.(必须要的,系统才能识别java文件) 2.编写一个简单的java代码: public class Hell ...

  7. RxJava 笔记

    前言 目前 RxJava 是安卓开发圈内最流行的库之一,本来准备研究研究,但看了扔物线写的<给 Android 开发者的 RxJava 详解>后,觉得生无可恋,哦不,是觉得已经写无可写. ...

  8. Windows7 java-jdk1.7安装及设置变量过程

    jdk安装的次数较少,容易忘记,这里专门记录一下. 1:jdk1.7网上到处都是可以随便下载一个.然后进行安装,不过在安装过程中把安装路径单独记忆一下,在配置变量的时候会用到. 2:安装完JDK后配置 ...

  9. Spring——scope详解(转载)

    摘自<spring 解密> scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在 对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于 ...

  10. JQ万能轮播图

    lunbotu.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8">  ...