NDK开发

1、NDK的概念
      NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk;
      集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so;
      可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作;
 
      使用NDK的好处:
      使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率 ;
      需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的;
 
       交叉编译:一个平台生成另一个平台上执行的代码;比如x86编译称arm平台可运行程序;
 
       JNI:语言中转的接口;
     
       链接库:静态链接库和动态链接库,把C代码编译称so库,静态的是相关依赖资源整合到一个文件中,好处是方便;
                     动态链接库体积小,但会出现相关资源找不到的问题;
 
       mk文件:C文件的编译脚本文件
 
       NDK目录结构;ndk-build  对mk配置的c文件进行编译;
                                 ndk-stack  调试代码的命令,可编译log文件,从而可以定位到代码;
                                 platform 支持的版本
                                 toolchains 交叉编译的工具
 
 

2、NDK开发包

      推荐使用r9d的这个历史版本,稳定。
      下载旧版本的NDK,google没有直接提供链接。可以通过下面的链接下载旧版本的NDK: https://dl.google.com/android/ndk/android-ndk-<version>-<platform>.<fileextension> 
      其中<version>为NDK的版本,如r7/r7b/r7c/r8/r8b等内容,
      <platform>为目标操作系统,可以为:windows/darwin-x86/linux-x86,分别对应于:Windows,Mac OS X (intel),Linux 32/64-bit (x86)平台,<fileextension>为文件后缀,
      如果<platform>为windows,则为"zip",否则为"tar.bz2"。

3、NDK环境变量的配置
      解压NDK,D:\Android\android-ndk-r9d   到环境变量中去。
      Eclipse里:确认下插件
      
 
4、生成SO等文件
      可以导入一个NDK的sample,复制项目路径,打开命令行。
      
      项目里会多出:
    
      此时F5刷新后可以直接在模拟器中显示结果。
      由于我们只生成arm的so文件即可。
      
      clean之后把项目里面JNI文件夹下Applicatio.mk注释掉,并删除obj文件夹。重新clean后再build,这样编译速度就快了。只生产了ARM的so.
 
4、开发NDK
      1、创建android项目;
      2、创建Jni目录;
      3、编写java的native方法; 
      4、生成JNI头文件:
               a、编写javaNative代码;
                     在工程的java文件夹中编写;
  1. eg: publicstaticnativeString getStringFromC();
               b、命令javah:通过jave文件生成头文件的命令。
                     
                    
                     classes后面分号指定android.jar的路径。这时在jni目录多了com_example_hindk_MainActivity.h  jni头文件的签名。这样就可以查找到java方法对应的native的哪些方法;        
                     创建一个C文件,实现native的方法:先把之前头文件里面的方法复制过来,重新写下方法;
                     同一级目录下创建个mk文件(项目的编译文件),可以从官方sample里面拷贝过来进行修改;
                     android.mk文件中LOCAL_MODULE指定JNI编译的SO叫什么名字,  LOCAL_SRC_FILES是需要编译的C文件。
                     build项目:到项目路径下ndk-build
               c、添加android.jar包到环境变量;
                     这是上一步的需要指定android.jar的路径;
        5、生成so文件的调用;
              java文件中可以使用静态代码块。
  1. static{
  2. System.loadLibrary("hi");
  3. }
  4. privateTextView textView;
  5. publicstaticnativeString getStringFromC();
  6. @Override
  7. protectedvoid onCreate(Bundle savedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. textView =(TextView)findViewById(R.id.text);
  11. textView.setText(getStringFromC());
  12. }
             
     
5、Eclipse下NDK环境
      这样设置就无需使用ndk-build的命令行了;
     
       
 
       打印log:
  1. #include<android/log.h>
  2. #define TAG "NativeMedia"
  3. #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
  4. LOGV("EOS was processed\n");
       并在mk文件里面配置下,代表log库引入当前项目中
  1. # for logging
  2. LOCAL_LDLIBS +=-llog
 
6、JNI交互:Eclipse开发工具配置
       配置生成javah选项:生成C++头文件;
          
         
         注意空格;点击对应java文件,执行;
        
 
       配置Eclipse添加native支持jni方法提示;
           Android Tools—>Add Native Support
           项目右键—>Properties—>C++ General—>Path and Symbols—>Add—>NDK的platforms的里面一个Arm里面的Include
           C文件中使用:Ctrl + Alt
 
       配置生成javap选项:打印java方法的方法签名,为了查找对应方法;
           

 

posted @ 2016-07-11 12:20  咖啡馆的水果拼盘  阅读(207)  评论(0编辑  收藏  举报