美文网首页
NDK开发之入门了解

NDK开发之入门了解

作者: 肚皮怪_Sun | 来源:发表于2017-10-22 17:38 被阅读0次
    • NDK

    Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序是运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
    NDK包括了:
    从C / C++生成原生代码库所需要的工具和build files。
    将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
    支持所有未来Android平台的一系列原生系统头文件和库

    • JNI

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

    • NDK和JNI的关系

    通俗点说NDK其实一个环境,可以为我们生成了C/C++的动态链接库。JNI是java和C/C++沟通的接口,为我们规定了一套标准(其实DNK也是基于JNI这个编码规范开发的) 。而Android程序是用java语言开发,然后通过JNI我们可以和C/C++进行交互。这样我们就可以用DNK和JNI来完成java+C/C++的方式。

    • 为何要用到NDK?

    概括来说主要分为以下几种情况:

    1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库被反编译的难度较大。
    2. 在NDK中调用第三方C/C++库,因为大部分优秀的开源库都是用C/C++代码编写的。
    3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。
    4. 硬件和性能方面。java是不能直接访问手机的硬件的,而C/C++的可以直接访问。
    • 环境搭建
      在安装好androidstudio前提下,我们只需要安装 NDK开发插件。

      打开System Setting>Android SDK,选择SDK Tools。然后勾选下图红色箭头指向的CMake LLDB NDK并下载安装,这样你的环境就搭建好了。 ABF646C6-79F2-49C7-BE37-C219BF84FDE1.png
    • 创建一个NDK项目

    创建项目和平常一样只是要把C++支持(invlude C++ suppoer)勾选,


    6534BF73-0D5D-4CEF-8B79-66077A6CCAE4.png
    1. Exceotions Support(支持异常处理)
    2. Runtime Type information(支持运行时类型信息)
    1087DFCC-CA7C-4FF9-A35D-87C60EF108C0.png

    创建完以后,我们会发现多了一个cpp的文件


    4F1BE064-6238-4105-8AE7-06E91FC051BC.png
    public class MainActivity extends AppCompatActivity {
    
    // Used to load the 'native-lib' library on application startup.
    //加载so库或jni库,在使用到该库之前加载就行
    static {
        System.loadLibrary("native-lib");
    }
    
    int a = 10;
    @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.
     *将用C++代码实现,在android代码中调用的方法
     */
    public native String stringFromJNI();
    

    在我们的native-lib.cpp文件中有个...stringFromJni方法中返回的了一段jstring:Hello from C++。
    extern "C":允许在编译的时候成C文件,向下兼容。(本身是 C++)
    JNIEXPORT:作用是允许该方法被java调用。
    JNICALL:约束函数如栈顺序,和堆栈内存清理的规则

    #include <jni.h>
    #include <string>
    
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_captain_wudongsheng_day3ndk_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject jobject1/* this */) {
    
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
    }
    
    943F5594-8DAB-4D10-A30C-F2EA09AB1184.png

    运行完项目你会发现textView设置的内容为Hello from C++,说明我们调用成功了。

    相关文章

      网友评论

          本文标题:NDK开发之入门了解

          本文链接:https://www.haomeiwen.com/subject/ztvmuxtx.html