您的位置:首页 > 编程语言 > Java开发

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类内容如下:

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

======================================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ndk win7 jni eclipse android