您的位置:首页 > 移动开发 > Android开发

android Jni NDK开发环境搭建及其简单实例的编写

2013-11-18 22:36 981 查看
android Jni NDK开发环境搭建及其简单实例的编写

由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下。遇到了些问题,然后总结下学习过程中的问题和开发流程

首先、Jni我的理解,属于一个中间的东西,如果把只做linux 的话,他就是linux的应用程序,但是如果做安卓的话,它就是中间层了(用于java语言调用C语言的接口)。我们说说

开发JNI的开发环境的搭建吧。

第一:我们用windows平台开发

准备工作:

1、我们安卓开发都需要的elipse ,包括SDK,首先要能够开发APK软件。

2、 我们需要一个如同linux 的环境,需要编译的环境,我们采用Cygwin(注意:1.7版本以上),否则不行。

3 、我们需要NDK工具包,可以通过安卓官网下载

1.1、cygwin的安装

下载地址:http://www.cygwin.com/

也可以选择我下载好的地址:http://pan.baidu.com/s/1b1UQE

1.1.1、 可以选择从网上下载最新的安装也可以选择我下载好的安装

1.1.2、 双击cygwin1.7.1/cygwin1.7.1.exe 选择Install form LocalDirectory

1.1.3、 选择安装的路径

1.1.4、 选择的下载之后的路径tmp

1.1.5、 点击下一步直到安装完成。

1.1.6、双击桌面的图标,看是否能够进去。有没有问题(输入gcc 等命令)。

1.2、Android的NDK安装

下载地址:http://developer.android.com/tools/sdk/ndk/index.html

1.2.1、将android-ndk-r9b-windows-x86.zip解压到任意目录(记住即可)

如:E:\android\android-ndk-r9b

1.2.2、设置环境变量(有的方法是通过/home/.bashrc设置的也可以),我就直接设置。右键点击我的电脑-属性(选择高级选项卡,点击环境变量设置),然后选择新建



1.2.3、重新关掉cygwin,然后打开,输入ehco$ndk 看是否显示E:\android\android-ndk-r9b目录,如果可以则设置成功

1.2.4、编译一个简单的实例 如下图,如果生成*.so 就说明没有问题。



第二:安卓JNI实例说明

1、 用eclips 新建一个android 工程

2、 修改Activity

2.1 加入:

static {
//注意你生成的库文件名称(如libhellojni.so),去掉lib和.so即可。
System.loadLibrary("hellojni");

}

2.2加入:

/*
* JNI中的方法
* */

public
static native
int
open(int fd);
public
static native
int
close(int fd);
public
static native
String read();

2.3 添加一个按钮:在onCreate方法中

Button tb=(Button)findViewById(R.id.button1);
tb.setOnClickListener(new OnClickListener() {
public
void
onClick(View v) {
/*调用Jni
*/
open(2);
close(2);
tv.setText(read());//修改文本框中的内容
}});



3、 通过javah生成.h文件(用于编译jni的程序)

3.1 切换到项目目录

#cd "C:\Documents and Settings\gonglinyuan\workspace\HelloJni"

#cd ./bin/class

3.2 执行java –h命令

#javah -jni com.cem.hellojni.HelloActivity

4、 编写jni代码

4.1、在工程目录中建立jni文件夹

#mkdir jni

#cp ./bin/class/com_cem_hellojni_HelloActivity.h ./jni

4.2、刷新eclipse的目录,新建com_cem_hellojni_HelloActivity.c 文件,实现头文件中的代码,如下面代码

#include
<string.h>
#include
<jni.h>

#include
"android/log.h"
#include
"com_cem_hellojni_HelloActivity.h"


static
const char
*TAG="Hello_module";
char buf[]="icegoly";

#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt,##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt,##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt,##args)


JNIEXPORT jint JNICALL Java_com_cem_hellojni_HelloActivity_open
(JNIEnv *env, jclass jc, jint fd)
{

LOGD("Jni open ing\n");
return 0;

}
JNIEXPORT jint JNICALL Java_com_cem_hellojni_HelloActivity_close
(JNIEnv *env, jclass jc , jint fd)
{

LOGD("Jni Close ing\n");

}

JNIEXPORT jstring JNICALL Java_com_cem_hellojni_HelloActivity_read
(JNIEnv *env , jclass jc)
{

LOGD("Jni Read ing\n");
//当时直接返回一个字符串失败,应该转换一下,APK上层才能够识别
return (*env)->NewStringUTF(env,(char*)buf);

}



5、 编写Android.mk

LOCAL_PATH :=
$(call my-dir)

include
$(CLEAR_VARS)

TARGET_PLATFORM := android-4
LOCAL_MODULE := hellojni
LOCAL_SRC_FILES := com_cem_hellojni_HelloActivity.c
LOCAL_LDLIBS := -llog

include
$(BUILD_SHARED_LIBRARY)


6、 编写Application.mk

APP_ABI := armeabi armeabi-v7a x86
7、 通过ndk-bulid编译生成库文件

# cd "C:\Documents and Settings\gonglinyuan\workspace\HelloJni"

#$ndk/ ndk-build

Android NDK: WARNING: APP_PLATFORM android-17 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
[armeabi] Compile thumb : hellojni <= com_cem_hellojni_HelloActivity.c
[armeabi] SharedLibrary : libhellojni.so
[armeabi] Install : libhellojni.so => libs/armeabi/libhellojni.so
[armeabi-v7a] Compile thumb : hellojni <= com_cem_hellojni_HelloActivity.c
[armeabi-v7a] SharedLibrary : libhellojni.so
[armeabi-v7a] Install : libhellojni.so => libs/armeabi-v7a/libhellojni.so
[x86] Compile : hellojni <= com_cem_hellojni_HelloActivity.c
[x86] SharedLibrary : libhellojni.so
[x86] Install : libhellojni.so => libs/x86/libhellojni.so



8、 生成APK文件,测试



最终实例代码下载地址:http://download.csdn.net/detail/icegoly/6572859
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: