Android学习——第一个NDK程序_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android学习——第一个NDK程序

Android学习——第一个NDK程序

 2013/12/15 21:09:03  小学徒V  博客园  我要评论(0)
  • 摘要:在前面的学习中,我们已经讲解了关于NDK编程的环境搭建流程,简单的使用我们也通过官网本身自带的例子进行说明了。可是相信大家一定还存在这么的一个疑惑:“如果我要自己利用NDK编写一个Android应用,具体应该怎么做?有什么要求”。OK,别担心,下面就让我们一起来利用NDK来编写一个简单的Android应用。1创建一个新的Project1)通过以下命令创建一个新的AndroidProject(详细的使用方法,大家可以回去重新参考博文《Android学习第二天
  • 标签:程序 android 学习 一个

  在前面的学习中,我们已经讲解了关于NDK编程的环境搭建流程,简单的使用我们也通过官网本身自带的例子进行说明了。可是相信大家一定还存在这么的一个疑惑:“如果我要自己利用NDK编写一个Android应用,具体应该怎么做?有什么要求”。OK,别担心,下面就让我们一起来利用NDK来编写一个简单的Android应用。

1 创建一个新的Project

   1) 通过以下命令创建一个新的Android Project (详细的使用方法,大家可以回去重新参考博文《Android学习第二天-android常用命令》)

android create project -n myfirstndk -t 1 -p ./myfirstndk -k cn.uc.myjni -a MainActivity

 当Project创建成功后,我们可以通过查看文件夹发现它的大体架构如下图:

  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" alt="" />

2 开始Coding

   1) 进入该项目的MainActivity.java所在的目录下,新建一个调用本地方法的类 NumberSum.java ,输入以下代码:

 1 package cn.uc.myjni;
 2 
 3 public class NumberSum {
 4 
 5     // 声明一个本地方法
 6     public native int add (int a, int b);
 7 
 8     // 加载名为 libnumber_sum.so的库
 9     // 根据Unix的规则,系统为自动为number_sum
10     // 添加上lib前缀和.so后缀
11     static {
12         System.loadLibrary("number_sum");
13     }
14 }

 

   2) 调用以下命令,编译NumberSum.java

javac -encoding UTF-8 NumberSum.java

编译成功后,控制台并没有特别的输出,同时,我们可以在目录下发现Number.class文件

QQf1czbY9rfqf0EfG473nLrmCceIX5DwUbM+TtN/AXwgq0xgXkCAAAAAAAAAAAAAAAAAL4Q/+EcAAC/gC9gAAAAAMCnS//fbXEyHlfrAQBAo/rurL50nfUAAKAh/qJ1voDT9QAAoOF80Y4eAwCA//9IFa/q42P83w0DAPDthr44r4vFVc56AADwA3+5AgDwO9J/pAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg3Z2Z6TrVjxN5Jq7903Y1XhV5dLCi+G/dzVukr31fvcDQYONi7gu+WvzubNc7RaYfqr/yQG4P+egXcHxpV/7/yqZb72pqJZhO8vSbbeOc36rOteDKF/BoBeCjtB/Zzm+s3/kFvDfn041vvEei7HbT9f0v4PfM/+Z19nrPVMDjrm/99LvW+Y1VfNidF2nl9tq2Tho1Xb/xfDqHtl9dPzZbzWcuf/qSWBz31cf+HMy+qjxtU37+qoUt+afrm3XapobqzM0tLkj3FXmqVMDn08+8vir+eP78bGqf3uPnh5pzrf8BoResHFdz2LXvUcxnNM/0er1dzFbNIZ4f7auN7RzHfc05tHXa/EP1f72ObqctNbrv0KvAB7o9M9MXpg+weCDPf6XL4qNYPZz6+b+V0kXSrdsPhaovHUwfH8V82l5E+KEB6u2cstWraV9mvLYvZ55VWjG6Nr8eQpttyxr/poj1+r5M34t0sf8S8LHaR0I8FdUz7DyQ7eeL+QCvZGjDmAuG9l2ZT9uLKCJaiPnn2hGVdV+j61fm6cxhJY/QZpi+X/61us5E2enFznngw8XPqdtL+sFIn2HngRz6DDLrDGVYOa5ib6yfbtfmcYbj5I9jTHs0y+ozOuc10q55isyxR6ff6Tn7+V9T57Tv++1Vc1//JPD5zsxEkaP4oDyKp7fa7nYyHotLqi0m6jjn9RzETJycYlNzDrHfuHVV+XYmXabDVHkm+mqDpS+dxTxFX9cKVZ65/KP1nZCxTnq5mUfEaLM5x0fxfnDaBPC+eIBfiWl/p5VfFAB8Jv/XfKxgzt9J3HfeEgAAAPh7/gGFRJ8WgLif6QAAAABJRU5ErkJggg==" alt="" width="563" height="58" />  

这里需要注意的是,我的命令中之所以指定源文件使用的编码是因为我使用的是UTF-8编码,在windows中直接通过javac NumberSum.java 进行编译的话,会出现以下错误

 

   3) 返回项目源代码文件夹下,比如我的就是返回到src目录下,通过javah命令,生成头文件

javah cn.uc.myjni.NumberSum

执行成功后,控制台没有输出什么特别的内容,同时,我们可以发现在src目录下多了一个头文件:

  SVMVIkg3BS1GeAIaF3WebAc/EiVZf/rxzNc/vm9rmx9vDz84F/K2r06eZRhmfqJTpiY8Ac2MOk+iT38nShJ6/Affrdemhl4POs+uTp5dmWhbmWg7/81y0NMhV5WmCoMsQmiLOD+BJ6AZUOfJ+veXRUmWH17yjZyZsr4252gTJFmZaHv95g9z7vPylYMWY34aL/gCT0DToPJ59Y/fEyVZmPq1b+TM5JevSj1Znvj50oMPdIoVgHqhzpPNWcv85IVZz/lZd8esu9M3cmbiy58+dbTPeTrm3Odnv31z6cGV3dCoTrECUC9Urz/JsDu7YcfC9J9m6J9N3bq4+J0tFd/QIzIAGges0wJAGXgCgDIKnhwaDCgoNS+n07lriLInpxMHaB2asVPBE3DaNGOnUu2Jx+PxeDyJREr2RSaT0S1U8JLQKp4Qnne5XMHgQi5HhBeE8C6Xy+fz3b17dz++r1u04GWgJTxxu908z4XCkY2NrVyOCC8ODnKhcMTr9aZSqfHx8VgsplvAoOlpCU9cLhfHZXmeIzxPCJ/LkVyOHBzkDg5yTqfT4XA4HA6n06lbwPpQfQHMqS6PCVqM4g9GGwGZX3qfkJbwZHx8nMtmOC7LcxzhuTJVNjc2QqurLeOJ8NPOiuVnJ+pXJ/SkuGi0RrLBE0I0eOJ0OqdnQ9WLw+HQLeCGImgxGiiqtCPV0xPp4oWgxVgTU+AJIRo8cTgcmXQqm0lnsxkuK8kqpJhVWssTujTd1NETXVYnwBNCNHgyNjammE/GxsbkGlP/HAlpnynpP2VNVR7IaKHzy10ouri70RIsH0UJ3aDYuFxUR3bdwgdBi1G8kIv9Sj746rGJu8oOnyq/tWRnoyVYkk+qn0PFMEpPZuGE1GQw1xKe0DSdYtl0ii3NKlk+n1X4XI7QdOXZ1PQciSP/xtUvcWK/Kfz5i0ehaFJyiaQpsaMXGy+PStETqSnKnlSNLT/nEZd+UkcsaxO2lu4stindojGM0hZr+riPlvDEbrcr5hO73V7ekLb18bJ/Y+WBgHQP2dfSF2J/O3qV5TE8KZpynHxSLbaygxXeFnOJNKXIR5ZfOVrZ9VWEIXsyazOwawlPhoeH2USCTSZTbFLIKpl0OpuRZBWeHx4eLm+osTzJH6/0In5CTwqmULp5IvOtq0xmCpkIntQC1Z7YbDbFfGKz2Spa0vQcCUmil0wBKpuqPJZSJwhajEaKMkrentwT8UJe7PCywSt7UpGkyr41oSm5cVLJLa5Cg9rCKNaCJ4Ro8GRwcDARjyfj8WJWYdl0SswqGY7LDg4OyrSl6TkSYiUjRZWNcY6eVx7rYlkyy6mRJ/nIpPaVB3+8fELJTeOL31r+5kbpLsXtWsKAJ6Wo9qSvr08xn/T19ekWcM0okabR/gn+UtMSnvT09MRjscT+fiK+n4zHk4kEm0yUZpV0T0+PpmDK56rH67maalXOLJQvlNrCA+W0hCfdx0O3gGuA9EaozI1UoDMt4QkAJ6QZOxU8AadNM3YqeAJOm2bsVHjeCkodyul07hrSfBEDcPrAEwCUgScAKANPAFAGngCgDDwBQJn/Aw7NcJ6qQawLAAAAAElFTkSuQmCC" alt="" width="269" height="83" />

   javah生成的头文件知识讲解:

  ① 从头文件的名字我们可以看出,它是由编译的调用本地方法的类名及其所在的包名通过下划线"_"分割组成。如我们的程序中是编译cn.uc.myjni.NumberSum生成的,所以就算cn_uc_myjni_NumberSum

  ② 头文件中的内容可能很多,但是我们只关注这个方法的声明:

JNIEXPORT jint JNICALL Java_cn_uc_myjni_NumberSum_add  (JNIEnv *, jobject, jint, jint);

  在这个声明中,我们可以清晰的看到方法名的最后面add就是在NumberSum类中声明的本地方法add,而前面的是 cn_uc_myjni_NumberSum就算完整的包名和类名,由此我们可以知道,一个完整的JNI函数名有3部分组成:Java、定义native方法的类的全名(包名+类名)、实际的函数名。这三部分用"_"进行连接。

 

   4) 在Project的根目录下,新建一个文件夹jni (必须叫做jni),将我们之前生成的头文件移动到jni文件夹下,如图:

  

  

   5) 新建一个c文件,名字为 number_sum.c,输入以下代码:

1 #include <jni.h>  
2 
3 // 此处的方法签名与头文件中声明的方法签名是相同的
4 // 建议直接从头文件中复制过来 
5 JNIEXPORT jint JNICALL Java_cn_uc_myjni_NumberSum_add(JNIEnv *env,jobject obj,jint a,jint b)  
6 {  
7     return (a+b);  
8 } 

   下面讲解下上面的一些相关内容:

  ① JNIEXPORT jint JNICALL JNIEnv 等都是在jni.h中定义的;

  ② 其中上面参数中的env表示JNI的调用环境,obj表示定义native方法的Java类的对象本身。

  

 6) 新建一个Android.mk 文件,建议直接从官方文档给的例子 hello-jni 中复制出来进行修改LOCAL_MODUE 和 LOCAL_SRC_FILES,代码如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := number_sum
LOCAL_SRC_FILES := number_sum.c

include $(BUILD_SHARED_LIBRARY)

   下面我们简单讲解一下上面几个参数的含义吧:

  ① LOCAL_PATH:Android.mk 的第一行必须是LOCAL。用于指定参与编译的C/C++源文件的位置。在上面例子中,宏函数mydir 是由系统提供的,用来返回当前目录的路径。也就是包含Android.mk文件的目录的路径。

  ② include ${CLEAR_VARS}:CLEAR_VARS变量是在系统中定义的,用来指定一个特殊的GNU Make文件。该文件用来清空很多以LOCAL_开头的变量,例如LOCAL_MODULE、LOCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES 等。但这些变量不包括LOCAL_PATH。之所以要清空这些变量,是因为这些都是全局变啦ing。同时这些变量又要在不同的GNU Make文件中使用,为了多个GNU Make文件不相互影响,就需要在执行每一个GNU make文件(Android.mk文件)之前先清空这些变量。

  ③ LOCAL_MODULE := number_sum :在每一个模块中必须定义 LOCAL_MODULE变量,用来指定生成的模块名。该变量的值必须是唯一的,而且不能包含任何空白分隔符。实际上,LOCAL_MODULE 变量的值就是生产共享库的文件名(不包括lib和.so),在编译时,系统会自动在文件名的前后添加上lib 和.so 。如果该模块名前缀加了lib,在生产共享库的时候不会进行添加。

  ④ LOCAL_SRC_FILES := number_sum.c:用来指定一个C/C++源文件列表,这里不需要指定头文件,系统会自动计算当前C/C++源文件 include的头文件。系统就直接将LOCAL_SRC_FILES变量指定的源文件传给编译器。C++源文件的默认扩展名是.cpp,但可以通过LOCAL_DEFAULT_CPP_EXTENSION 变量改变 C++文件默认拓展名,例如将该变量的值设成".cxx",注意不要忘记了" . "

  ⑤ include ${BUILD_SHARED_LIBRARY} : BUILD_SHARED_LIBRARY是在系统中定义的,用来指定一个GNU Make脚本文件。该脚本文件会根据以LOCAL_开头的变量来生成共享库文件。如果想生成静态库文件,可以使用BUILD_STATIC_LIBRARY变量。

 

   7) 为了能够把我们调用共享代码库执行的程序结果显示出来,我们对生成的代码界面进行一定的修改:

     I. 打开 res/layout/main.xml 文件,给TextView添加上一个Id,方便我们在后台通过id获取组件进行显示内容的修改:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6     >
 7 <!-- 给TextView 添加了ID -->
 8 <TextView  
 9     android:id="@+id/info_text"
10     android:layout_width="fill_parent" 
11     android:layout_height="wrap_content" 
12     android:text="Hello World, MainActivity"
13     />
14 </LinearLayout>

    II. 给我们的主界面MainActivity.java的onCreate() 方法添加上将结果显示到界面上的逻辑代码:

 1 package cn.uc.myjni;
 2 
 3 import android.app.Activity;
 4 import android.widget.TextView;
 5 import android.os.Bundle;
 6 
 7 public class MainActivity extends Activity
 8 {
 9     /** Called when the activity is first created. */
10     @Override
11     public void onCreate(Bundle savedInstanceState)
12     {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.main);
15 
16         // 通过Id获取TextView组件
17         TextView textView=(TextView) findViewById(R.id.info_text);  
18         NumberSum sum = new NumberSum();  
19         // 调用本地方法 
20         int result=sum.add(10, 20);  
21         textView.append("\n 10+20="+result); 
22     }
23 }

3 编译共享代码库

   1) 打开cmd,将路径转移到项目的根目录myfirstndk下,执行命令ndk-build (详情大家可以参考博文《Android学习——windows下搭建NDK_r9环境》的 第1节),执行后控制台输出如下图,同时我们可以在\obj\local\armeabi路径下查看到libnumber_sum.so共享库:

    RIAQgAgQAhABQgAiQAhABAgBiAAhABEgBCAChABE/AfV2rK/poQgKAAAAABJRU5ErkJggg==" alt="" />

4 打包验证

    1) 同样在cmd中,直接执行命令 ant debug 进行打包:

  adbkEoUZhXTg3t3E5/W570M3ZaEGXD1P/0G2EGZez77Z2us4CaXT/C3g/0GdEmpSzSwxcAMhgMp0zcAEgBwYuAGRyPGPgAkAW5eyEgQsAOZRzBi4AZMHABYBMpvMFAxcAcpieLBm4AJDDbMHABYAs5osHDFwAyIGBCwCZzJcMXADI4mR5ysAFgBwWD84YuACQw+KUgQsAWSxPHzJwASCH5RkDFwCyeHD2iIELADmcPmTgAkAWpw8fM3ABIIezR2s5cFv6mampwvIjXQFYnD3+I/nAzTNoWppoqcIycAHUPXz8JO3AzTZo1nfg8vkX6KlHT57KA3dY4V0fGuTThf2aczX74+oqjIkZ1Ifa5a5QmjwBbI7HT55e2toxB585dDSvzS+ri0J888ugc+XX+rqKb6dhdD6uawH02h9Pn2k+4VoXa1NM2O8N3nDACfnoixKOcMX3xmHaAvjLkz+fa34PVz9VOxy4ykP1+VvzCY1j7mEQAz319Jk0cCOGnXdIWeMnHLhB5wr5N8lH85Y3SQCb5s/nLxL+oVntLe/p3iElnKvcH1RXbSUoH2UcAP317MXLdfyLDwCwfp6/eMXABYAcnr98zcAFgBxevmLgAkAWr16/YeACQA6v/8PABYAsXr95y8AFgBzevH3HwAWAHN6+e8/ABYAc3r7/wMAFgBzefWDgAkAW7z98ZOACQA4MXADI5MPHTwxcAMjh46dzBi4A5PDxnIELAFl8Ov/MwAWAHBi4AJDJ+WcGLgBkcf75vwxcAMiBv9oLAJn8+2jMwAWAHO7+/i8GLgDk8PO9f67CwB1+lWRbe8mY68OKVrMCsPZ+uvd78oEbN3qUM6vt0XYR33qQfhADQN1PvyYeuNGjZ9UGboarrEEY3MDG+tE3cF3/yWxdHxq8Cbj2a869eMv1uvh2imlScu2Ri1L2R46jbxqAtfTj3d8ube0Yc9IyoYIGXO2UluJHx5Hzqa5YC/GuR9QFYPP9cPc3zSdc66J1NgXNEf1AlC9JOODkbUEDt3l/AGwU78D9Qj81Eg5c/SWrOXBDTzGnM4CN8sMv94SBGzHIrEOwjfius6z79bMs+cBV1lUwcIGNJw/cov0//KluNueRa5C53jLjmNdqkhGKqm3QrCuPALDh7vgG7lozJ2CX2QDouTu//LrBA7fgEyWA1bHxAxcAVsWdnxm4AJAFAxcAMvkHAxcA8uATLgBkwidcAMjjf72UlXbNFX/eAAAAAElFTkSuQmCC" alt="" />

  打包成功后,我们可以在bin文件夹下看到相应的myfirstndk-debug.apk

  

   2) 通过 emulator 命令打开你的模拟器(命令详情可以参考博文《Android学习第三天-打包常用命令》 第3节)

   

   3) 通过 adb 命令将apk安装到模拟器中(命令详情可以参考博文《Android学习第一天-adb常用命令》 第3节),如图表示安装成功。

  

   4) 打开模拟器中的程序MainActivity 显示如图则表示安装成功。

   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" alt="" />  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efeu7g3ucO7t1/cO/+g0/uf+XJZ1/Z8+wre559uasnn335yWdf3rv/lb3PvfLUcwe36pW9+1/e++xLe599ae/+l/fuf+Wprcfsfe7g3ude2fvcK72nP/38QfHTv/8Pon5ygw59/x8OPf38oaef716nc5H9L3ckXfO6uxKv3NHBp587+PRzB5/a/8pTz76899mX9j7zoqgnf/TCkz964Unp7UvdryDev3jW088ffPr5g08998pT+ztfs/PRTz3X1eY/xVObN/lK7+313mT3u3e/vnSfN/mmvV+290MPPv38we/f5F/v0Pc7X/mp517Z++zLe5956bov+NT+l5967pWnnz/YObd7Dz3/Nbd+aOdbHNy7/5Unn315zzMv737mpd0/eumJv3/xe3/34uN/98Ljf/fC4z/858d/+M/f/eE/P/53//y9v3vhib9/YfePXtzzzEviz2brj0G8zit7nn1l9zMvd/XEMy8/8SNRLz3xo5d2/+il3c+8vOeZl7tX6NzzjT+Vf6e6nmqmdu3p5w/dOGXqbrvb7rb/blpz/ddgvi4Wt6BSk71L9d12t/333qTKVqFxl+q77W77H6S1rv0aEOvVd6m+2+62/zFaa/3XQKEOSHWpBlO79vRzB3/fN3W33W3/P219n+jb+emdDz380M5P7+zr6/t9384tWnP916FcFcitAvlVIL/KrK7v3f/y7/um7rZ/723XI7v2/WDf7/supLbtnm19n+jbvn379vu27/ryrt17d+9/Zv++H+z7+pe/vuO+Hdu3b9/2iW3b7tn2+77NntZs/8qf4gNp3p/mAxmBqqzt+dELv++butv+Xbevf+3r/Rf7T587vW/vPtk9sp2f3tl/sb//Yv/v9lP2PbPvwAsHDrxw4KEHH/qIQ++R7Xp416OPPbr7sd279+7e/8P9+364b/8P9+/eu3v3Y7sffezRXY/skt3zu72736411v7FHSVcMcIVI90xkuAbj//tP/6+b+pu+/fbHnrwof6L/f3nTvef6+8/17/vB/t2fGqHuP2xr3WPTCaTbbtn27Z7tm3btk12j6zXUQ+8cODAjw8ceOHAQw9/BNV9fX2PPvHovh/u/vo3H3royzseemTHrkd2PvTIjoe+vHPX13bu++Gju/c+eufR+L4f7ItH4xu/2qg2qotLizc+Ux56+CGL0ULz9MbGRrVaXZxb3P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" alt="" />

 

 

 

上一篇: Dealing with InterruptedException 下一篇: 没有下一篇了!
发表评论
用户名: 匿名