android JNI开发环境搭建及简单demo测试

来源:互联网 发布:linux snmp 无法启动 编辑:程序博客网 时间:2024/05/16 06:35

一、在开始搭建环境之前,你应具备以下几个条件

1、  JDK及环境变量配置正确

2、  安装了Eclipse 

3、  安装了Android SDK and ADT

如果没有安装,可以去我的网盘下载集成了sdk和adt的eclipse

地址:http://pan.baidu.com/s/1sjpprlj 

二、环境搭建步骤

1、  Android NDK 安装 

地址:http://pan.baidu.com/s/1jGgahoE(也可以去官方网站下载)

2、  安装Cygwin

     地址:http://pan.baidu.com/s/1c0zjoTq(可以在线安装)

3、  安装Eclipse中C/C++开发环境CDT

三、安装ndk

下载完成后,直接解压到你的目标文件夹下,比如我的:C:\androidDevelop

其中samples几个实例开发演示项目,docs内是技术文档

四、安装cygwin

2、因为我之前安装的时候采用了备份,所以可以去我的网盘下载安装文件,也可以去官方网站下载,但是下载速度可能不容乐观,我下载了一天。

首先下载setup 官方网址http://www.cygwin.com/

注:下面的安装步骤和安装路径一定要记住,因为卸载的时候要按照安装的步骤同样使用setup卸载,安装的时候新建一个文件夹,不然安装完成后会产生很多文件

(1)在线安装流程

A、下载完setup点击运行,第一步选第一个

B、安装位置

C、本地备份的位置

D、选第一个就行

E、选163的比较快点

F、最后一步 点击devel这行,后边的文字变成install

G、之后一直下一步就行了 下载和安装过程都比较长,你可以干点别的了

(2)本地安装(选在线安装的忽略此步)

基本和之前的步骤一致,只有两处不一样,1、下图这里选第三个2、本地备份的位置选择你安装文件的路径

 

(3)验证cygwin

到安装目录下运行cygwin.bat。注:第一次运行时,它会自动创建用户信息,用户信息存放在“.\Cygwin\home”中。

输入:“cygcheck -c cygwin”命令,会打印出当前Cygwin的版本和运行状态,如果status是ok的话,则cygwin运行正常。

分别输入:“make –v”和,“gcc –v”命令如果检测成功,会有make和gcc相关版本信息打印出来。

 

(3)添加NDK路径

我的电脑右键-属性-高级设置-环境变量 名字ndk注意分大小写

变量值/cygdrive/C/androidDevelop/android-ndk-r9d

前面不变c是C盘后面是我的ndk安装路径,注意是“/”因为实在Linux下运行

 

再打开cygwin.bat运行cd $ndk(注意分大小写的)如果进入到ndk安装目录下说明设置成功

 

四、安装cdt

打开eclipse-->file-new-project

如果有c/c++这项说明已经集成cdt不需要再安装了

如果没有则Help --> install new software-->

然后把work with这一项改成下图这样

勾掉group

找到eclipse C/C++ 这个 之后一直下一步安装就行了,安装完成后打开eclipse-->file-new-project

如果有c/c++这项说明已经安装成功

五、简单demo测试

简单的回传Stringdemo

1、新建android项目,只有一个TextView显示信息

public class AndroidJni extends Activity {

public static native String getJniData();

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_android_jni);

        TextView tv = (TextView) findViewById(R.id.textView1);

        tv.setText("测试-->"+getJniData());

    }

}

2打开cmd 输入cd C:\androidDevelop\software\AndroidJni定位到项目目录下

注:androidDevelop\softwareeclipse的工作空间,也就是存放刚刚创建的项目的目录;AndroidJni是刚刚创建的android项目的目录

3、输入javah -classpath src -d jni com.example.androidjni.AndroidJni命令生成.h文件

注:com.example.androidjni是包名 AndroidJniactivity的名字

4、回到eclipse 点击project->clean,你会看到项目目录下多了一个jni文件,里面有一个.h的文件

5、在jni文件右键-new-file新建一个AndroidJni.c的文件(名字自己取,下面代码需要一点C基础)

6、打开之前生成的.h文件会看到如下代码

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_example_androidjni_AndroidJni */

#ifndef _Included_com_example_androidjni_AndroidJni

#define _Included_com_example_androidjni_AndroidJni

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     com_example_androidjni_AndroidJni

 * Method:    getJniData

 * Signature: ()Ljava/lang/String;

 */

JNIEXPORT jstring JNICALL Java_com_example_androidjni_AndroidJni_getJniData

  (JNIEnv *, jclass);

 

#ifdef __cplusplus

}

#endif

#endif

7、把Java_com_example_androidjni_AndroidJni_getJniData (JNIEnv *, jclass)复制到刚刚创建的.c文件中,这个方法就是c/c++与java对接的接口方法。

8、写入头文件

#include <stdio.h>

#include "com_example_androidjni_AndroidJni.h"这是刚刚在jni中生成的.h文件,作为C语言的头文件导入c代码中,嫌名字长可以改一下名字

9、实现上面复制过来的方法 注意JNIEnv *env, jclass obj

JNIEXPORT jstring JNICALL Java_com_example_androidjni_AndroidJni_getJniData(

JNIEnv *env, jclass obj) {

return (*env)->NewStringUTF(env, "Hello Jni!");

}

10、最后代码

#include <stdio.h>

#include "com_example_androidjni_AndroidJni.h"

JNIEXPORT jstring JNICALL Java_com_example_androidjni_AndroidJni_getJniData(

JNIEnv *env, jclass obj) {

return (*env)->NewStringUTF(env, "Hello Jni!");

}

11jni文件右键-new-file 新建一个Android.mk文件,内容如下:

LOCAL_PATH := $(call my-dir)  

include $(CLEAR_VARS)  

LOCAL_MODULE    := AndroidJni  (你要生成的库文件的名字,自定义)

LOCAL_SRC_FILES := AndroidJni.c  (刚刚创建的.c文件名字)

include $(BUILD_SHARED_LIBRARY) 

12、保存文件后打开cygwin.bat

定位到本项目的文件夹下cd c:/androidDevelop/software/AndroidJni

接着输入 ¥ndk/ndk-build,出现下图情况就成功了

13、回到eclipse  project-->clean 然后项目目录下多了一个obj文件,打开AndroidJni.java写入以下代码

Static{

System.System.loadLibrary("AndroidJni");;//Android.mk文件中定义的库名字

}

最后代码:

public class AndroidJni extends Activity {

public static native String getJniData();

static {

System.loadLibrary("AndroidJni");

}

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_android_jni);

        TextView tv = (TextView) findViewById(R.id.textView1);

        tv.setText("测试-->"+getJniData());

    }

}

14、用手机或模拟器运行项目之后可以看到libs文件夹下面多了一个armeabi文件,这时候可以把obj文件删掉,没有什么用处了。手机上运行结果就是输出了 测试-->Hello Jni,armeabi文件中多了一个libAndroidJni.so文件,这就是我们最后需要的文件

如过安装过程中出现问题可参考

http://blog.csdn.net/habbyge/article/details/12321267

http://my.oschina.net/owen123456/blog/85658

0 0