Eclipse + android-ndk 实现编译so库 告别Cygwin之类的繁琐环境
2014-04-07 19:25
465 查看
技术进步的标志就是让原来复杂的东西变得更简单。
最新版的Windows版本NDK: android-ndk-r9c-windows-x86 已经支持在Windows环境下独立编译so了,摆脱了之前Cygwin之类的辅助工具。
下面举个例子如何在Windows环境下编译so。
------------------------------我的环境-------------------------------
1、Win7 (32bit)
2、 Eclipse Java EE IDE for Web Developers.Version: Kepler Service Release 2)
3、ADT22.6
4、CDT8.3
5、 android-ndk-r9c-windows-x86
-------------------------------------------------------------------------
★1、首先,新建一个Android工程(方便演示jni调用),具体细节不懂的找度娘。然后在src同级目录里新建立以下四个目录:
|--jni
|--helloJni
|--src
|--include
建好的工程目录如下图所示:
★2、然后,编写java层的jni接口类,位于src/com包下,如下图:
MyJni.java类内容如下:
★3、Eclipse编译运行一次,然后会在src同级目录生成bin目录,进入目录bin/classes/com,拷贝JNI类对应的.class文件MyJni.class到bin/classes目录下,然后CMD命令行进入这个bin/classes目录(也就是到com层同级目录),输入:javah
-jni com.MyJni
如下图:
然后会在classes目录生成一个com_MyJni.h头文件
★4、拷贝这个.h文件到工程目录的/jni/helloJni/include下,然后在/jni/helloJni/src目录下新建一个对应的.cpp文件:
com_MyJni.cpp,内容如下:
★5、好了,对应的Jni的头文件以及cpp实现文件都写好了,下面编写Jni的mk文件。
在/jni目录下面新建两个文件:Android.mk、Application.mk。
Android.mk内容如下:
其中:
LOCAL_MODULE := MyJni 表示生成的so库名(不需要添加lib前缀以及.so后缀)
LOCAL_SRC_FILES 表示要编译的源文件
LOCAL_C_INCLUDES
表示要引用的头文件
include $(BUILD_SHARED_LIBRARY) 表示要生成动态库
Application.mk的内容如下:
★6、然后,在Activity中编写调用so库的代码:
★7、最后,完事具备,就差编译前的NDK编译相关的设置了。此时的工程目录结构如下图:
在工程上右键,选择"Build Path->Configure Build Path",然后选择"Builders->new"
来新建一个编译器,如下图所示
然后选择新建一个 Program:
然后按照下图设置ndk路径:(也就是ndk-build.cmd的路径以及jni工程目录路径,根据自己的实际路径来)
★8、OK!现在点击Eclipse的运行按钮,会自动编译so。
编译后运行我们的Android程序,会在屏幕下方提示"IM FRM Jni" 这个从Jni返回的字符串内容。
欢迎大家一起讨论,共同进步。
===============================华丽转身,咦=============================
源码下载:(注意:下载源码后上面第7步骤中需要修改为自己的实际路径)
点我免积分下载demo
======================================================================
最新版的Windows版本NDK: android-ndk-r9c-windows-x86 已经支持在Windows环境下独立编译so了,摆脱了之前Cygwin之类的辅助工具。
下面举个例子如何在Windows环境下编译so。
------------------------------我的环境-------------------------------
1、Win7 (32bit)
2、 Eclipse Java EE IDE for Web Developers.Version: Kepler Service Release 2)
3、ADT22.6
4、CDT8.3
5、 android-ndk-r9c-windows-x86
-------------------------------------------------------------------------
★1、首先,新建一个Android工程(方便演示jni调用),具体细节不懂的找度娘。然后在src同级目录里新建立以下四个目录:
|--jni
|--helloJni
|--src
|--include
建好的工程目录如下图所示:
★2、然后,编写java层的jni接口类,位于src/com包下,如下图:
MyJni.java类内容如下:
package com; public class MyJni { // 从Jni层返回一个字符串 public native String getStrFromJni(); }
★3、Eclipse编译运行一次,然后会在src同级目录生成bin目录,进入目录bin/classes/com,拷贝JNI类对应的.class文件MyJni.class到bin/classes目录下,然后CMD命令行进入这个bin/classes目录(也就是到com层同级目录),输入:javah
-jni com.MyJni
如下图:
然后会在classes目录生成一个com_MyJni.h头文件
★4、拷贝这个.h文件到工程目录的/jni/helloJni/include下,然后在/jni/helloJni/src目录下新建一个对应的.cpp文件:
com_MyJni.cpp,内容如下:
#include <com_MyJni.h> JNIEXPORT jstring JNICALL Java_com_MyJni_getStrFromJni (JNIEnv *env, jobject) { const char *pTmp = "IM FRM Jni"; return (env)->NewStringUTF(pTmp); }
★5、好了,对应的Jni的头文件以及cpp实现文件都写好了,下面编写Jni的mk文件。
在/jni目录下面新建两个文件:Android.mk、Application.mk。
Android.mk内容如下:
################################Android SDPBuilder Project Makefile########################### LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MyJni LOCAL_SRC_FILES := helloJni/src/com_MyJni.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/helloJni/include include $(BUILD_SHARED_LIBRARY) ########################################################################################
其中:
LOCAL_MODULE := MyJni 表示生成的so库名(不需要添加lib前缀以及.so后缀)
LOCAL_SRC_FILES 表示要编译的源文件
LOCAL_C_INCLUDES
表示要引用的头文件
include $(BUILD_SHARED_LIBRARY) 表示要生成动态库
Application.mk的内容如下:
APP_MODULES := libMyJni APP_STL := stlport_static
★6、然后,在Activity中编写调用so库的代码:
public class MainActivity extends Activity { // 载入so库 static { System.loadLibrary("MyJni"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyJni jni = new MyJni();
// 此处显示从Jni层返回的字符串 Toast.makeText(this, jni.getStrFromJni(), 10000).show(); } }
★7、最后,完事具备,就差编译前的NDK编译相关的设置了。此时的工程目录结构如下图:
在工程上右键,选择"Build Path->Configure Build Path",然后选择"Builders->new"
来新建一个编译器,如下图所示
然后选择新建一个 Program:
然后按照下图设置ndk路径:(也就是ndk-build.cmd的路径以及jni工程目录路径,根据自己的实际路径来)
★8、OK!现在点击Eclipse的运行按钮,会自动编译so。
编译后运行我们的Android程序,会在屏幕下方提示"IM FRM Jni" 这个从Jni返回的字符串内容。
欢迎大家一起讨论,共同进步。
===============================华丽转身,咦=============================
源码下载:(注意:下载源码后上面第7步骤中需要修改为自己的实际路径)
点我免积分下载demo
======================================================================
相关文章推荐
- Android 使用OpenCV之编译环境非CygWin方式(Win7+Eclipse+ADT+CDT+NDK)
- Android安装NDK运行环境无需cygwin自动编译生成SO
- android-ndk-r7b编译环境Cygwin工具搭建及配置
- android-ndk-r7b编译环境Cygwin工具搭建及配置
- android-ndk-r7b编译环境Cygwin工具搭建及配置
- windows环境 cygwin android-ndk-r7 编译 ffmpeg
- 用ndk环境编译android可用的so库
- Android新版NDK环境配置(免Cygwin)
- Android新版NDK环境配置(免Cygwin)
- NDK环境搭建(Native Code的编译,不需要Cygwin)
- android -- NDK 编译环境搭建
- android学习——NDK入门 windows下安装cygwin 与 Eclipse使用CDT 自动编译
- windows下搭建NDK+Cygwin编译环境…
- Android编译Lame的全平台so库方案2,并实现转码mp3
- Windows下配置cygwin和ndk编译环境
- Android安装NDK运行环境无需cygwin
- NDK下 将Platinum SDK 编译成so库 (android - upnp)
- Windows下NDK开发环境的搭建(Cygwin+Android-SDK+NDK)
- 基于ndk_r7_windows编译实现ndk项目,不需要cygwin