在window下,简单利用NDK编译c/c++文件,在android项目中调用。

在window下需要借助cygwin来模拟linux环境,Download:cygwin  和 android-ndk-r5   。


    第 1 步:安装 NDK

你就需要解压缩它。解压后将它放入合适的目录中。我们把它放在和 Android SDK 相同的目录下。记住你把它放在哪里了。

现在,你也许想要在路径设置中添加 NDK 工具。如果你在 Mac 或 Linux 下,你可以用你的原生路径设置来完成。如果你在 Windows 下的 Cygwin,你就需要设置 Cygwin 的路径设置,将C:\cygwin\bin和F:\android\android-ndk-r5b;加入环境变量path中。

第 2 步:创建项目

创建一个常规的 Android 项目。为了避免日后的问题,你的项目的路径必须不包含空格。我们的项目有个叫做“com.mamlambo.sample.ndk1”的包,带有一个叫做“AndroidNDK1SampleActivity”的默认 Activity——你之后还会看到它们。

在这个项目的顶层创建一个叫做“jni”的目录——这是你放置原生代码的地方。如果你很熟悉 JNI,那你就会知道 Android NDK 很大程度上基于 JNI 的概念——它本质上是个只有有限的 C 语言编译头文件的 JNI。

第 3 步:添加一些 C 语言代码

现在,在 jni 文件夹中,创建一个叫做 native.c 的文件。一开始将以下 C 语言代码写入该文件,我们以后再添加另一个函数:

#include <jni.h>


#define DEBUG_TAG "NDK_AndroidNDK1SampleActivity"

jlong Java_com_leo_testndk_MainActivity_helloLog(JNIEnv * env, jobject this, jlong x,jlong y)

{

    return x+y;

}

不过该函数的名字很重要。它遵循了以“Java”的特定字样开头,后面跟着包名称,然后类名称,然后方法名称,和 Java 中定义的一样。每一部分都由一根下划线隔开,而不是点。

该函数的头两个参数也很重要。第一个参数是 JNI 环境,它与 helper 函数会被频繁调用。第二个参数是该函数所属的 Java 对象。

jlong x和jlong y是两个参数。

第 4 步:从 Java 中调用原生代码

既然你已经写好了原生代码,让我们回头看看 Java 这边。在默认的 Activity 中,按照你的喜好创建一个按钮,并添加一个按钮处理器。从按钮处理器中,对 helloLog 作调用:

 
 
  1. helloLog(3,2); 

然后你必须在 Java 这边添加函数声明。在你的 Activity 类中添加如下声明:

 
 
  1. private native void helloLog(long x,long y); 

它告诉编译和链接系统该方法将在原生代码中实现。

最后,你需要加载原生代码最终编译到的库。在 Activity 类中添加如下的静态初始化程序来根据名称加载库(库的名字随你决定,在下一步还会用到):

 
 
  1.  
  2.  
  3. static {  
  4.  
  5.     System.loadLibrary("ndk1");  
  6.  
  7. }  
  8.  

第 5 步:添加原生代码的 Make 文件

在 jni 文件夹中,现在你需要添加在编译中要用到的 makefile。该文件必须以“Android.mk”命名,如果你之前命名的文件为 native.c,库为 ndk1,那么 Android.mk 的内容就应该是这样:

 
 
  1.  
  2.  
  3. LOCAL_PATH := $(call my-dir)    
  4.  
  5.     
  6.  
  7. include $(CLEAR_VARS)    
  8.  
  9.     
  10.  
  11.    
  12.  
  13.     
  14.  
  15. LOCAL_MODULE    :ndk1    
  16.  
  17. LOCAL_SRC_FILES :native.c    
  18.  
  19.     
  20.  
  21. include $(BUILD_SHARED_LIBRARY) 
注意:各个参数后面不能够有空格,会报错:make: *** No rule to make target   "*******'.h", needed by `********.o'.  Stop.


第 6 步:编译原生代码

既然你的原生代码已完成,make 文件也已就绪,是时候编译原生代码了。在命令行下(Windows 用户在 Cygwin 下),你需要在你的项目的根目录下运行 ndk-build 命令。ndk-build 工具就在 NDK 工具目录中。将它添加到我们的路径中是最方便的办法。

在之后的编译中,如果你使用“ndk-build clean”命令,那么你可以确保所有的东西都被重新编译了。

第 7 步:运行代码

现在你已准备妥当可以运行代码了。在你最喜欢的模拟器或者手持设备中载入该项目,查看 LogCat,在设备中查看输出结果。

可能有两件事情会发生。首先,它可能正常工作了。这样的话,恭喜你!不过你可能还是想要继续阅读下去。你也可能在 LogCat 中得到类似“Could not execute method of activity”这样的错误。这很正常。这只是说明你漏掉了某个步骤罢了。用 Eclipse 很容易发生这种情况。通常,Eclipse 被设置为自动重编译。如果它不知道有东西被修改了,它就不会自动重编译和重链接。在本例中,Eclipse 不知道你编译了原生代码。所以,“清除(cleaning)”该项目(在 Eclipse 工具栏中点击项目(Project)->清除(Clean)),强制 Eclipse 重编译。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值