技术进步的标志就是让原来复杂的东西变得更简单。
最新版的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();
}
}
在工程上右键,选择"Build Path->Configure Build Path",然后选择"Builders->new" 来新建一个编译器,如下图所示
然后选择新建一个 Program:
然后按照下图设置ndk路径:(也就是ndk-build.cmd的路径以及jni工程目录路径,根据自己的实际路径来)
★8、OK!现在点击Eclipse的运行按钮,会自动编译so。
编译后运行我们的Android程序,会在屏幕下方提示"IM FRM Jni" 这个从Jni返回的字符串内容。
欢迎大家一起讨论,共同进步。
===============================华丽转身,咦=============================
源码下载:(注意:下载源码后上面第7步骤中需要修改为自己的实际路径)
======================================================================