Eclipse + android-ndk 实现编译so库 告别Cygwin之类的繁琐环境

本文介绍了如何在Windows 7环境下,利用Eclipse、ADT和NDK r9c编译Android JNI库,不再依赖Cygwin。详细步骤包括创建Android工程、编写JNI接口类、配置Android.mk和Application.mk文件,以及设置Eclipse的构建路径。通过这些步骤,开发者可以便捷地在Windows系统中生成SO库并直接在应用中调用。
摘要由CSDN通过智能技术生成

技术进步的标志就是让原来复杂的东西变得更简单。

最新版的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.classbin/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

======================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值