zoukankan      html  css  js  c++  java
  • Android NDK 环境搭建 + 测试例程(转)

    懒得废话一大堆概念,关于ADT、NDK的概念要是你不懂,怎么会搜到这里来?所以你只需要根据下面的步骤来,就可以完成NDK环境搭建了。

      步骤:(假设你未安装任何相关开发工具,如果已经安装了,就可以跳过)

    一. 环境搭建

    1. 安装 jdk 
       安装完毕后配置好环境变量(我安装的是jdk1.7)
        JAVA_HOME = C:Javajdk1.7.0_51
        PATH = C:Javajdk1.7.0_51in
        CLASSPATH = .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar

      可以打开 cmd 后 输入:java -version 检查到底安装成功没。

    2. 安装 eclipse 和 adt
      安卓官网已经将adt集成到了eclipse中,之前在线安装adt的过程简直是惨不忍睹。
      在安卓官网上下载集成包,我下载的是 adt-bundle-windows-x86_64-20140624.zip
          我把 这两个文件分享在了百度云盘可以下载:http://pan.baidu.com/s/1kTA4vn5
      下载后建议解压在 D:Android 目录,也可以选择别的目录。
      集成包解压后在 D:Android 下将有两个目录和一个文件:
         eclipse  : eclipse 目录
         sdk   :安卓sdk目录,里面只有4.4的包
         SDK Manager.exe : SDK管理器,可以用来下载别的版本的开发包,国内访问经常被拒绝,绕过的方法可以上网搜。
        
    3. 安装NDK
      在安卓官网上下载 NDK 压缩包并且解压。需要注意的是NDK目录不得有空格,建议依旧解压到 D:Android
      我下载的版本是 android-ndk-r9d-windows-x86_64.zip
      r7版本之后可以直接使用ndk-build命令完成编译,所以不必安装cygwin环境。
      配置环境变量path:
        在path 中加入 NDK的安装目录,比如:D:Androidandroid-ndk-r9d

      保证在打开 cmd 后,输入 ndk-build 显示如下提示。

        
     
      而不是找不到 ndk-build 这条命令!

    二. TestNDK

    1. 建立新的安卓工程:TestNDK
    向导在创建应用的时候 默认的包 前缀是 com.example ,没必要更改。所以最后的包名为:com.example.testndk
    创建一个启动Activity,就叫 TestNDK (非要叫MainActivity的话,后面记得更改)
    ps: 我创建的时候,选择创建Activity结果没有反应,只能创建一个java文件。这时记得在 AndroidManifest.xml 里面的application标签下加上:

    复制代码
     <activity
                 android:name="com.example.testndk.TestNDK"
                 android:label="@string/app_name" >
                 <intent-filter>
                     <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />          、
           </intent-filter> </activity>
    复制代码

    不管是用向导还是直接新建java文件,最后用下列代码覆盖 TestNDK.java 文件:

    复制代码
     package com.example.testndk;
     
    import android.app.Activity;
    import android.widget.TextView;
    import android.os.Bundle;
     
    public class TestNDK extends Activity
    {
        @Override
         public void onCreate(Bundle savedInstanceState)
         {
             super.onCreate(savedInstanceState);
             TextView  myTextView = new TextView(this);
             myTextView.setText( stringTestNdk() );
             setContentView(myTextView);
         }
     
         public native String stringTestNdk ();
         public native String stringTestNdk2 ();
     
         static {
           try{
              System.loadLibrary("testNDK");
          }catch(UnsatisfiedLinkError ule){
              System.err.println("WARNING: Could not load library testndk!");
          }
       }
     }
    复制代码

    2. 生成 .h 头文件
      使用eclipse 编译一下工程,目的是生成相关的的 .class 文件,因为 动态链接库还未创建,即使安装到手机上也会崩溃。
            不知道是不是版本的问题,我搜到的教程里面反正乱七八糟,根本就不对应我的实际情况。
      在我的电脑上,eclipse将生成的class文件存放在 binclasses  (相对于工程目录,后面的操作全部基于根目录)
      生成 .h 头文件的程序是 javah (不了解的可以搜索相关资料看一下)
       在根目录下启动命令提示符(或者打开命令提示符切换到根目录下,取决你的右键菜单里面有没有打开命令提示符)。
         输入如下命令:
          javah -classpath binclasses;D:Androidsdkplatformsandroid-20android.jar -d jni com.example.testndk.TestNDK 
      其中 -classpath 里面有两个目录,一个是前面说的 binclasses ,根据实际情况更改
      第二个是 安卓的jar包,要是不加上就会报错,如果你把sdk安装在别的目录,就做出相应的更改。如果目录里面有空格,就把字符串用 "" 包围。
      -d 指定生成的目录,即将生成的头文件存在在工程目录下的jni目录。

      上述命令执行完毕后,jni目录下增加了一个 :com_example_testndk_TestNDK.h 文件,内容暂时不用管。

    3. 编译生成 so 文件
      在jni目录下创建两个文件
        第一个是:testNDK.c

    复制代码
     #include <jni.h>
     #include <string.h>
     // public native String stringTestNdk (); 方法的c签名,格式为 Java_包名_类名_方法名
     JNIEXPORT jstring JNICALL Java_com_example_testndk_TestNDK_stringTestNdk(JNIEnv *env, jobject this)
     {
         return (*env)->NewStringUTF(env, "Hello,test NDK !");
     }
    复制代码

        第二个是:Android.mk

     LOCAL_PATH := $(call my-dir)
     include $(CLEAR_VARS)
     LOCAL_MODULE    := testNDK
     LOCAL_SRC_FILES := testNDK.c
     include $(BUILD_SHARED_LIBRARY)

       保存后,退回到工程目录下打开命令提示符,执行:ndk-build
      命令执行完毕后,在 libsarmeabi 目录下应该增加了一个 libtestNDK.so 文件。

    4. 安装apk
      重新编译运行eclipse,不出意外将会启动一个程序,显示: Hello,test NDK !
      如果程序运行奔溃,并且Log处显示:WARNING: Could not load library testndk!。
      说明载入 共享库失败,如果确定代码没有变动,就用Winrar打开 bin目录下面的 apk文件,看看 lib/armeabi 里面有没有 libtestNDK.so 。 如果没有,就打开安卓工程的属性下的 java bulid path,将 libs/armeabi 加入源路径,并且重新清理运行。

    三. 相关说明

    1.  我在 TestNDK类中定义了两个 native 方法,生成的 头文件中有这两个方法的签名,但是我只实现第一个方法。
      如果你在 程序中调用了 第二个方法就会导致 找不到 native 方法异常。
       要是共享库载入成功(即没有显示 自定义的那个警告)

    2.    上述仅实现了一个类中的一个方法,但是 一个 c 文件里面是可以包含多个 不同的导出函数的,所以 使用 javah得到的方法签名 的实现代码都可以放在一个 c 文件里面。                                (实际上方法签名也可以自己写,没必要非得用 javah)
        要是有多个c文件生成一个 so,比如 1.c 、2.c ,可以将  LOCAL_SRC_FILES 赋值为:
           LOCAL_SRC_FILES :=  1.c 2.c 
      
    3.  关于 到底该如何编写c程序,可以参考教程《JNI完全手册》写的比较详细。

  • 相关阅读:
    svn使用教程
    事务的隔离级别--全网最详细
    idea的java类图标C不见,取而代之是J标识,且写代码无提示
    text .global_start 和_start
    transformClassesWithDexForDebug
    RxJava基本流程和lift源码分析
    Rxlifecycle(三):坑
    Rxlifecycle(二):源码解析
    RxJava操作符之Share, Publish, Refcount
    Rxlifecycle(一):使用
  • 原文地址:https://www.cnblogs.com/dongweiq/p/3928690.html
Copyright © 2011-2022 走看看