写这篇文章的目的:
笔者为了项目,学习Android NDK,但是发现所有关于Android NDK的文章,都讲解非常粗糙,让新人容易陷入困惑的境地,笔者不才,花了将近3个小时。
整理如下,若有错误之处,敬请指出。
1. AndroidNDK下载
Android NDK
http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86.zip
http://dl.google.com/android/ndk/android-ndk32-r10-windows-x86_64.zip
http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-darwin-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk32-r10-linux-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86.zip
http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86_64.zip
http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-linux-x86.tar.bz2
http://dl.google.com/android/ndk/android-ndk64-r10-linux-x86_64.tar.bz2
http://dl.google.com/android/ndk/android-ndk-r10-cxx-stl-libs-with-debug-info.zip
笔者电脑安装的是Win7 64位的操作系统。
所以我选的是
http://dl.google.com/android/ndk/android-ndk64-r10-windows-x86_64.zip
下载下来解压到D盘的Android文件夹。
2. AndroidNDK 环境变量的配置。
右键单击“我的电脑”->”属性”->”高级系统设置”->”环境变量”,
在path变量里添加ndk存放的目录 D:\Android\android-ndk-r10
打开CMD窗口,键入ndk-build –v, 如果出现如下字符,那么ndk环境已搭建好
3.何为AndroidNDK
首先要先认识到我们电脑绝大部分都是使用X86架构的,而手机使用的是ARM架构,它们程序文件并不能互相通用的。
Android NDK实际上是一个交叉编译工具,让我们可以在非手机、非Android操作系统上,编译出能够在Android系统上使用的库。
4.使用AndroidNDK 把C++的库转成Java接口和.so库。
4.1先在 E:\AndroidWorkspace文件夹里创建一个MyJNI的文件夹。
并新建一个 “TextJNI.java”文件,里面内容键入如下代码:
package com.example.textjni;
public class TextJNI
{
static{
System.loadLibrary("jniinterface");
}
publicstatic native int getInt();
publicstatic native String getString();
}
4.2根据我们对java的理解,所以我们创建一个目录树 \com\example\textjni\
并把TextJNI.java文件放进去.
4.2打开CMD窗口,切换到 E:\AndroidWorkspace\MyJNI目录下.
4.2使用javac命令生成class文件,键入命令为, 这里需要搭好JDK环境,如果没有搭,请百度一下,就不在这里说明了。
javac .\com\example\textjni\TextJNI.java
4.2使用javah命令生成jni头文件,键入命令为,
javah –jni com.example.textjni.TextJNI
你会发现MyJNI目录下多一个.h文件,这个头文件是自动生成,无需做任何改动!
4.3新建一个jni的目录,把该头文件放进去,并新建一个TextJNI.cpp文件,我们要在该cpp文件里实现我们的.h接口.
TextJNI.cpp文件内容如下:
#include"com_example_textjni_TextJNI.h"
#include <stdio.h>
#include <stdlib.h>
int sum ()
{
int x,y;
x = 100 ;
y = 1000;
x += y;
returnx;
}//实现 com_example_textjni_textJNI.h 的方法
JNIEXPORT jint JNICALLJava_com_example_textjni_TextJNI_getInt
(JNIEnv *, jclass)
{
returnsum();
}
JNIEXPORT jstring JNICALLJava_com_example_textjni_TextJNI_getString
(JNIEnv *env,jclass)
{
returnenv->NewStringUTF("HelloNDK");
}
4.2在jni文件夹里创建Android.mk文件.看不懂下面的自行百度
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=jniinterface
LOCAL_SRC_FILES := TextJNI.cpp
include $(BUILD_SHARED_LIBRARY)
4.2 使用ndk-build命令生成 .so库, 注意键入该命令的是在MyJNI目录下
你会发现MyJNI目录下多了2个文件夹。
obj是生成中间临时文件的目录,我们不用管它。
在libs\armeabi 下,libjniinterface.so 就是生成的库
以后只要我们提供libjniinterface.so 和TextJNI.java 给客户,他们就可以使用了。
5.使用eclipse创建一个简单的Android工程,并使用上面我们生成的库。这里默认你已经安装好eclipse的Android环境。
5.1 创建一个名为Test的Android项目
5.2 找到该项目所在的目录
把armeabi\libjniinterface.so拷贝进该工程libs目录下。
把java文件按照包名,放进src文件夹里. (包名实际就是目录树,一定要一一对应)
5.3 回到eclipse,编译该项目,它会更新目录。自动把.so和java文件包含进工程中
5.3 编写测试库的代码. 在 “MainActivity.java”文件里 键入如红框的位置:
Toast.makeText(this, TextJNI.getString(), Toast.LENGTH_SHORT).show();
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
Toast.makeText(this, TextJNI.getString(), Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
5.4 运行测试,笔者使用的是Android手机,直接使用它来测试,
选择机器,单机“OK”
5.5 在手机里单击”菜单”->”Settings”.会弹出”HelloNDK”
参考文献:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0415/1166.html