windows安卓NDK编程

去年搞过一次NDK,当时觉得挺麻烦,以后就一直没再搞过,现在公司的项目需要使用NDK编程,今天又搞了一边,遇到了些问题,和大家分享一下

.

一. 安装Cygwin

1.下载Cygwin http://cygwin.com/setup-x86.exe   双击运行出现如下界面,点击下一步

选择install from internet ,点击下一步

选择默认位置 c:\cygwin ,点击下一步

依旧默认位置,继续点击下一步

默认选项Direct Connection 就可以,继续点击下一步

可以选择网易163服务器,继续下一步

出现下面界面

选择需要安装Cygwin组件 : 这里我们只需要以下组件 : binutils , gcc , gcc-mingw , gdb , make , 不用下全部的组件;

例如输入gcc 后下面会自动列出各组件,点击All右边的单词,直到下面都变成install为止,然后点击下一步就可以等待安装了,安装完后点击上一步就又回到该界面,

另外几个组件安装方式同上。

安装完后目录是这样的

双击上面目录中的Cygwin.bat ,在启动的窗口中输入make      -version ,若出现类似下面界面,表示安装成功

二.下载ndk

1.- windows版本NDK:android-ndk-r9c-windows-x86.zip (32位),android-ndk-r9c-windows-x86_64.zip (64位)
该版本是用在windows上的Cygwin下, 不能直接在windows上直接运行;

2.下载完后解压并放到C:\\cygwin\中,目录结构如下

三.创建安卓工程

1.创建安卓工程,并在工程根目录下新建jni文件夹,

2.运行一下工程,让工程中的bin文件夹中生成class文件,(class文件在工程中的bin中看不到,可以从资源管理器中打开该bin文件夹)

3.生成对应的头文件

例    可以通过这种方式生成头文件 javah    -classpath      F:/ndkTest/bin/classes    -d     c:/      -jni     com.example.ndktest.TestJNI

(F:\ndkTest\bin\classes 是包所在目录 , c:/表示生成的头文件存放位置,com.example.ndktest.TestJNI 是包.类名)

(备注   下面的控制台不是windows的命令窗口,而是 C:\cygwin中的Cygwin.bat   )

把c盘中生成的com_example_ndktest_TestJNI.h复制到安卓工程中的jni文件夹

在jni文件夹中新建.cpp文件,如 main.cpp    ,然后使用include命令包含.h文件,并把.h文件中的函数复制到main.cpp中,记得要给复制过来的函数加上参数,同时把末尾的;改成  {      }   ,该例子中使用NewStringUTF创建了一个utf8编码的字符串并返回

在jni文件夹中编写Android.mk文件      mk文件一定要当心,写错后不会报错,但调用时却会抛异常

获取当前文件内容 : $(call my-dir) 是编译器中的宏方法, 调用该宏方法, 就会返回前的目录路径;

赋值符号 : " := " 是赋值符号, 第一句话 是 返回当前文件所在的当前目录, 并将这个目录路径赋值给 LOCAL_PATH;

初始化编译模块参数 : $(CLEAR_VARS) 作用是将编译模块的参数初始化, LOCAL_MODULE LOCAL_SRC_FILES 也是这样的参数;

指定编译模块 : LOCAL_MODULE    := hello , 指定编译后的 so 文件名称, 编译好之后系统会在该名称前面加上 "lib", 后缀加上 ".so";

指定编译源文件 : LOCAL_SRC_FILES := main.cpp 告诉编译系统源文件, 如果有多个文件那么就依次写在后面即可;

编译成静态库 : include $(BUILD_SHARED_LIBRARY), 作用是高速系统, 编译的结果编译成 .so 后缀的静态库;

静态库引入 : NDK的platform中有很多 ".a" 结尾的动态库, 我们编译动态库的时候, 可以将一些静态库引入进来;

为了防止手动输入错误,直接把代码放在这,大家可以直接复制后修改一下

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=TestJNI

LOCAL_SRC_FILES := main.cpp

include $(BUILD_SHARED_LIBRARY)

在安卓工程根目录下新建Application.mk文件,并输入如下内容  ,注意 APP_MODULES 值要和Android.mk中 LOCAL_MODULE 值一样

同样把代码放在这,方便大家复制

APP_PROJECT_PATH:=$(call my-dir)

APP_MODULES:=TestJNI

四.编译

启动c:\\cygwin中Cygwin.bat,输入 cd  你的工程所在绝对位置   我的工程在f盘中,工程名叫ndkTest,所以输入cd     f:/ndkTest,注意下线方向

输入/android-ndk-r9c/ndk-build   ,我的android-ndk-r9c在C:\cygwin中,所以可以直接这样输  参见 二.下载   2.中目录结构

输入完后回车,会出现如下提示,表示生成so库成功

刷新一下安卓工程,在libs中armeabi中看到生成的lib开头,.so结尾的库  (右击安卓工程名,选择refresh即可刷新工程)

在调用声明的native函数前要先调用System.loadLibrary() ,调用一次即可,参数是类库的名字,注意,不包括开头的lib和结尾的.so

安卓ndk编程到此就完结了。

五.注意事项

有的安卓工程中还有armeabi-v7a文件夹,记得把生成的so库也要拷贝到该文件夹中一份。

mk文件输入错误后不会报错,直到调用时才会抛出异常,一定要小心

备注:以上在windows7   旗舰版 32位 sp1 ,i3处理器上编译通过,在 安卓arm模拟器上测试通过,小米note 上测试通过

如有转载请注明出处  谢谢

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 23:29:44

windows安卓NDK编程的相关文章

【转】Android NDK学习(2)Windows下NDK开发环境配置

一.配置好Android开发环境 现在android SDK的版本已经到了4.4了,几乎不用配置,下载下来解压,SDK跟Android开发专用Eclipse都有了.喜欢. 二.下载安装安卓NDK 下载最新版,解压即可. 2013年6月7日: 目前版本已经到了r8e. 三.下载安装cygwin   由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从uni

安卓 网络编程

这几天学校实训项目需要开始学习安卓编程,其中有一部分是涉及网络知识, 1 private class SendThread extends Thread 2 { 3 public SendThread(String s) 4 { 5 mURL = s; 6 } 7 public void run() 8 { 9 BasicHttpParams httpParams; 10 httpParams = new BasicHttpParams(); 11 HttpConnectionParams.se

NDK编程中遇到的问题之一 --- “/android-ndk/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist' function”

参考:http://www.cnblogs.com/frydsh/archive/2013/05/11/3073349.html 从网上下载了一个包含jni代码的Android工程,编译它的时候出现以下错误: .../android-ndk/ndk-build Invalid attribute name:       package       .../android-ndk/build/gmsl/__gmsl:512: *** non-numeric second argument to `

初探WINDOWS下IME编程

初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本人对IME的研究结果,并提供示例工程供大家参考: 下载示例工程 10.6K 本文示例程序运行结果如上图1.将用到的API RegOpenKey:打开注册表一键RegQueryValue:查询一键值RegQueryValueEx:同上RegCloseKey:关闭打开的键 LoadKeyboardLay

安卓NDK 使用

> 环境搭建参考百度经验(未验证): 1.安卓项目中建好对应类,然后编译一下,在cmd窗口中cd到项目的bin\classes目录下,使用 javah –jni 全限类名 生成对应的头文件 2.在Eclipse中右键对应项目,Android Tool –>Add Native Support.. ,输入对应库的名字: 3.在自动生成的jni文件夹中拷入步骤1中生成的头文件 4.如果遇到include<jni.h> 为Unresolved inclusion,则在项目中右键,buil

超全Android JNI&NDK编程总结

由于网上关于JNI/NDK相关的知识点介绍的比较零散而且不具备参照性,所以写了这篇JNI/NDK学习笔记,便于作为随时查阅的工具类型的文章,本文主要的介绍了在平时项目中常用的命令.JNI数据类型.签名等,便于查阅相关资料.文末相关参考资料比较适合刚接触或者不熟悉Android NDK开发的朋友参阅. 常用命令 javac 编译java源文件生成.class文件 由于JNI对应的头文件由javah工具根据对应的.class文件生成,所以在进行JNI编程之前,写好Java代码后需要先编译,在使用ja

【转】Windows的多线程编程,C/C++

在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread    使用API函数CreateThread创建线程时,其中的线程函数原型:  DWORD WINAPI ThreadProc(LPVOID lpParameter);在线程函数返回后,其返回值用作调用ExitThread函数的参数(由系统隐式调用).可以使用GetExitCodeThread函数获得该线程

Android Studio Ndk 编程

现在开发Android程序基本都已经从Eclipse转到了Android Studio了, 最近项目需求, 需要用到ndk编程, 于是就折腾了一下. 开发环境 Android Studio 1.5.1 android-ndk-r10e gradle 2.8 首先我们新建一个工程叫做NdkDemo, 创建后的工程目录结构如下 然后我们打开gradle.properties文件, 在文件的尾端写一句, 如果没有写这一句会编译不通过 android.useDeprecatedNdk=true 接着配置

windows 套接编程

网络在我们生活中日益频繁.网络化已经成为了一个社会发展的趋势.winsocket 是一种常用的网络编程方法. 首先我们来讲讲计算机网络的基本知识.首先是IP地址,在网络中每个主机都有一个IP地址.(一个主机可以有多个IP,但是在每个网络里面每个主机都必须有唯一的一个IP,比如说你的电脑有两个IP一个为192.168.1.34 另一个为192.168.2.34   这说明了这个主机在两个点1网段里.也在点2网段里面   1网段上计算机可以找192.168.1.34,2网段上的计算机是找不到192.