windows下androidNDK的开发

          这篇文章是我一年前写的,当时只是写的word文档,今天将其中的步骤按照该文档重新走了一遍,还是挺详细的,不会没有关系,只要认真参照教程,那么windows下androidNDK开发不是梦,好了,下面看教程。

android应用的ndk开发基础,即在android应用中用java文件调用c文件

1.首先需要安装windows下模拟linux环境的cygwin软件,如下:

1.下载setup.exe

到官网www.cygwin.com 在屏幕的中央是一个黑绿两色组成的 “C” 徽标,标题是“Install or update now.”。在该链接上点击,这将下载一个小程序 setup.exe250KB)。这个安装程序将在您的机器上引导 Cygwin 环境的安装或更新过程。 

2.运行setup.exe,进行安装,如下图:
图 1. Cygwin 环境的安装向导

技术分享

点击 Next按钮。 
选择下载位置
在这个页面上,选择"Install from Internet"

图 2. 选择安装类型

技术分享

一直点击 Next按钮,一直到出现下图界面:

技术分享

选择一个下载站点。因为这些站点是义务的镜像,所以选择一个下载点有点风险(通常它们是可用的,但有时不可用)。通常,试试离你比较近的那个站点。(有一个http://mirrors.163.com最快)

点击 Next按钮。 
选择包进行安装
在这个页面上,您将选择要安装的包。默认情况下,Cygwin 基本包将不安装 GCC,因此,您必须修改默认设置。
将鼠标移动到 Devel边的加号(+)上,然后点击它展开 Devel类。

技术分享

这一步,我们选择需要下载安装的组件包,为了使我们安装的Cygwin能够编译程序,我们需要安装gcc编译器,默认情况下,gcc并不会被安装,我们需要选中它来安装。为了安装gcc,我们用鼠标点开组件列表中的“Devel”分支,在该分支下,有很多组件,我们必须的是:

binutils 
gcc 
gcc-mingw 
gdb

make

鼠标点击组件前面的循环按钮,会出现组建的版本日期,我们选择最新的版本安装,下图是选中后的四类组件的截图:

binutils 组件

技术分享

gcc 组件

技术分享

gcc-mingw 组件

技术分享

gdb组件

技术分享

注意还有make组件 

选完以后,我们选择下一步,进入安装过程,如下图所示,

技术分享

一直到下载完成,就ok了!

3.测试是否安装成功

运行cygwin,输入make -v 和 gcc -v 如果能找的,则表示安装成功。

安装NDK

安装ndk很简单,只需要把下载的ndk文件解压缩到指定的目录即可。

配置NDk

修改Cygwin目录/home/username 下的.bash_profile文件,在文件末尾加入如下代码:

NDKROOT=/cygdrive/ndk文件的路径(NDKROOT=/cygdrive/d/android/ndk)
export NDKROOT

(注意:NDKROOT名字可以自己,ndk文件路径是你 解压缩后ndk的路径,特别注意将斜杠换成反斜杠 和 去掉d:中的:(windowslinux路径区别问题))

2.打开eclipse,新建android工程hello-jni,在工程的根目录下新建jni文件夹

A.HelloJni.java的关键代码如下

TextView  tv = new TextView(this);
 tv.setText( stringFromJNI() );
 setContentView(tv);
public native String  stringFromJNI();//这个是声明的本地方法
public native String  unimplementedStringFromJNI();
 //用静态快加载libhello-jni.so文件
static {
        System.loadLibrary("hello-jni");
}

B.开始,运行cmdcd进入hello-jni工程的HelloJni.java的目录,javac HelloJni.java生成字节码

C.进入hello-jni工程的bin目录,运用javah生成  .h  文件

Javah  -classpath . -jni 包名.类名

3.将生成的  .h  文件的函数头文件,复制到新建的hello-jni.c文件里,注意在hello-jni.c文件里需要引入#include <jni.h>文件,hello-jni.c文件如下:

#include <string.h>
#include <jni.h>

/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java
 */
Jstring
//这个是用javah生成的头
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
#if defined(__arm__)
  #if defined(__ARM_ARCH_7A__)
    #if defined(__ARM_NEON__)
      #define ABI "armeabi-v7a/NEON"
    #else
      #define ABI "armeabi-v7a"
    #endif
  #else
   #define ABI "armeabi"
  #endif
#elif defined(__i386__)
   #define ABI "x86"
#elif defined(__mips__)
   #define ABI "mips"
#else
   #define ABI "unknown"
#endif

    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");
}
4.新建android.mk文件

 LOCAL_PATH :$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni

LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

简单说明一下

LOCAL_PATH := $(call my-dir)

LOCAL_PATH 表示此时位于工程目录的根目录中 (call my-dir)返回当前目录的地址

LOCAL_MODULE := NewJNI

LOCAL_MODULE 用来区分 Android.mk 中的每一个模块。文件名必须为一 不能有空格 这个

是你以后库文件生成的文件名 编译器会自动给你加上前缀 lib 和后缀.so.

LOCAL_SRC_FILES := com_demo_jni_Jni.c

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY 的意思就是建立一个动态共享库库


2.,将写好的hello-jni.c文件和android.mk文件拷贝到jni文件夹下

3.右键工程,properties

技术分享

点击builders----->new------->program

技术分享


技术分享

Location的参数是cygwin的安装路径下的bin文件夹下的bash.exe文件

Working Directory的参数是cygwin的安装路径下的bin文件夹路径

Arguments的参数是:

--login -c “cd/cygdrive/创建的工程的路径&&$NDK/ndk-build

在这里我的创建的工程的路径是:f/codethree/hello-jni(注意f盘符没有:即不是f:)

$NDK是当时安装cygwin时在cygwin的安装路径下的C:\cygwin64\home\Administrator.bash_profile文件配置的ndk的解压路径,如下:

NDK=/cygdrive/f/android/androidNDK/android-ndk-r9d-windows-x86_64/android-ndk-r9d

export NDK

技术分享


技术分享

注意在勾选Specify working set of relevant resources时指定资源选择你的工程的jni目录即可

当以上步骤都正确配置无误,保存配置后应该就会自动编译jni目录下的C相关代码并输出相应的.so库文件到工程的libs目录下,libs目录会自动创建。也会自动创建obj目录

编译时控制台输出类似如下:

技术分享

再运行工程,结果正确。

以后修改了C代码,保存后也会自动触发编译,省时省力。


若是用代码方式实现的编译生成的.so文件的方式,如下:

截图如下;

技术分享

四、配置NDK路径设置

可以在cygwin中通过vim修改,也可以在windows安装目录中修改 home\<你的用户名>\.bash_profile 文件中最后添加环境变量

NDK=/cygdrive/e/Andriod/develop/android-ndk-r4

export NDK

其中NDK=/cygdrive/<你的盘符>/<android ndk 目录> ,"NDK"这个名字随便起,以后经常用不要太长。

重启cygwin,输入:

cd $NDK

可进入ndk对应目录说明设置OK。

五、编译演示工程

现在就可以编译相关NDK工程了(一些用c/c++写的程序),编译方法如下:

1、在cygwin命令行下,进入android项目工作目录:

cd $NDK

2、依次进入samples\hello-jni目录,(完整路径示例: E:\Andriod\develop\android-ndk-r4\samples\hello-jni)

3、运行

$NDK/ndk-build

注意:该命令$NDK和/ndk-build是连接到一起的,中间没有空格,实际使用时是打入完整的$NDK/ndk-build,不要只打ndk-build。

4、正常编译完成后会在你的项目libs/armeabi目录下生成对应的 .so文件。


至此,window下androidndk的开发环境搭建以及简单的开发案例就结束了。






郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。