• Android NDK学习记录(一)


    一、NDK环境在Mac中部署

         1.准备eclipse,android sdk安装包,android ndk安装包(http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86_64.tar.bz2

         2.部署android开发环境

         3.部署NDK开发环境(配置环境变量)

    二、编写基于NDK的HelloWorld

         1.它的作用即是把实现了我们在Java code中声明的native方法的那个libraryload进来,或者load其他什么动态连接库。

    1 static {
    2         System.loadLibrary("MFirstNDK");
    3     }

         2.native关键标识的方法,不需要方法体的抽象方法,是由C/C++来实现的

    1 public static native String getStr();

         3.MFirstNDK.cpp 文件  用于返回java 本地方法getStr返回的操作实现

     1 #include "jni.h"
     2 #include "com_threew_ndk_NDKPlus.h"
     3 /*
     4  * Class:     com_threew_ndk_NDKPlus
     5  * Method:    getStr
     6  * Signature: ()Ljava/lang/String;
     7  */
     8 JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getStr
     9   (JNIEnv *env, jclass thiz) {
    10     return env->NewStringUTF("hello world JNI");
    11 }

       4.编写好以上文件代码,就可以在Android Activity里面调用本地方法getStr(),并获取"hello world JNI"

    三、利用Ant工具快速生成java本地方法的.h的头文件

        eclipse中带有ant插件,可以见在项目下编写ant xml文件,并添加入ant工作目录中,双击或run as 就可以直接在jni文件夹下生成想要的头文件。xml内容如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!-- ====================================================================== 
     3      2014-9-20 上午11:27:05                                                        
     4 
     5      MFirstNDK    
     6      description
     7                    
     8      Rubert                                                                
     9      ====================================================================== -->
    10 <project name="MFirstNDK" default="BuildAllHeaders">
    11     <description>
    12             description
    13     </description>
    14 
    15     <!-- ================================= 
    16           target: default              
    17          ================================= -->
    18     <target name="BuildAllHeaders">
    19         <antcall target="BuildGetStringHeader"></antcall>
    20         <antcall target="BuildGetIntHeader"></antcall>
    21     </target>
    22 
    23     <!-- - - - - - - - - - - - - - - - - - 
    24           target: depends                      
    25          - - - - - - - - - - - - - - - - - -->
    26     <target name="BuildGetStringHeader">
    27         <javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKInt"></javah>
    28     </target>
    29     
    30     <!-- ================================= 
    31           target: name              
    32          ================================= -->
    33     <target name="BuildGetIntHeader" >
    34         <javah destdir="./jni" classpath="./bin/classes/" class="com.threew.ndk.NDKPlus"></javah>
    35     </target>
    36     
    37 </project>

    四.新建c++ class 文件,并用java本地文件调用

       1.在jni文件夹下创建Hello的c++文件,会生成Hello.h 和 Hello.cpp文件

       2.在Hello.h文件内添加一个方法,内容如下:

     1 /*
     2  * Hello.h
     3  *
     4  *  Created on: 2014-9-20
     5  *      Author: Rubert
     6  */
     7 
     8 #ifndef HELLO_H_
     9 #define HELLO_H_
    10 
    11 class Hello {
    12 public:
    13     Hello();
    14     char * getWords();
    15     virtual ~Hello();
    16 };
    17 
    18 #endif /* HELLO_H_ */

        3.在Hello.cpp文件的实现方法如下:

     1 /*
     2  * Hello.cpp
     3  * Created on: 2014-9-20
     4  * Author: Rubert
     5  */
     6 #include "Hello.h"
     7 Hello::Hello(){
     8     // TODO Auto-generated constructor
     9 }
    10 char* Hello::getWords(){
    11     return "hello";
    12 }
    13 Hello::~Hello(){
    14     // TODO Auto-generated constructor

         4.在MFirstNDK.cpp中的实现如下:

    1 JNIEXPORT jstring JNICALL Java_com_threew_ndk_NDKPlus_getWords(JNIEnv *env, jclass){
    2     Hello h;
    3     return env->NewStringUTF((const char*)h.getWords());
    4 }

         5.遇到的问题

        在编译工程中出现,4中得Hello 文件无法找到,前提是我头文件导入了,但是还是无法通过运行。最后发现是Eclipse错误提示的原因:最后是把一些提示都取消掉了

        http://www.oschina.net/question/1987532_162259?sort=time

        中间发现可能是这个问题,但是导入后依旧如此

        http://blog.csdn.net/meegomeego/article/details/8109604

     五、基于X86模拟器和Arm模拟

           genymotion模拟器   基于X86架构

           Android自带模拟器   基于Arm架构

           一般情况下,NDK是生成Arm的so文件,如果想改成X86的so文件。那么就得在工程目录下,新建一个Application.mk文件,内容如下:

    APP_ABI := x86 

    如果两者都可以生成,则这么些

    APP_ABI := x86 armeabi

    六、附

         Terminal相关记录,mac下得终端命令

         1.乱码问题,打开终端,偏好-设置-高级-中文

         2.通过cd命令进入文件夹,用open ./ 来打开当前文件夹

         3.javah -jni com.xx.xx.xx.Xxx 生成头文件

              

     MFirstNDK.zip

           

  • 相关阅读:
    candy——动态规划
    HTTP协议(转)
    linked-list-cycle-ii——链表,找出开始循环节点
    linked-list-cycle——链表、判断是否循环链表、快慢指针
    转: utf16编码格式(unicode与utf16联系)
    【转】Nginx模块开发入门
    【转】依赖注入那些事儿
    转: OpenResty最佳实践
    转:linux的源码查看, c++语法 查看网站
    【转】所需即所获:像 IDE 一样使用 vim
  • 原文地址:https://www.cnblogs.com/royi123/p/3983569.html
Copyright © 2020-2023  润新知