一、建筑环境:

1、需要的工具:

A、cygwin    (在windows下使用LINUX系统)                                                                    http://www.cygwin.com

B、android-ndk-1.6_r1-windows (主要是起到将C或C++编译成动态库的作用)   http://dl.google.com/android/ndk/android-ndk-1.6_r1-windows.zip

C、eclipse(建立ANDROIDproject的软件。使用ANDROID的童鞋应该早就安装了。在这不复述)。

2、安装cygwin

A、从上面指定的网址下载cygwin  软件。点击cygwin.exe进行安装。

B、安装软件执行起来后,通常採用默认情况。一直点击下一步就好。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Jpc3lqdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

上面这个图有三个选项,一般默认就好,第二个是说,仅仅下载不安装,下载后须要手动安装;第三个是说。在下载到本地后再进行安装。

这个是指该软件的安装路径,一般不须要更换。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Jpc3lqdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

这个路径是指下载的内容保存在什么位置,这个自己能够指定。

让其自己主动下载,再点击“下一步”。

这个是须要选择下载内容的地址,之前在这选择N次。后面安装都失败了,假设想多选择几个下载地址,能够按住“ctrl”进行选择,建议不要多选。多选后会创建多个目录

假设失败就重头開始,选择新的地址,重复安装。才干成功。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2Jpc3lqdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

让其自己主动下载,再点击“下一步”。

这一步是要选择须要安装的内容。一般像GNU   gcc   g++  等经常使用工具须要安装。当然也能够所有安装。但所有安装的时间会非常长。

最后下载完毕后会自己主动安装,点击完毕就好。

3、验证cygwin成功安装。

执行安装好的cygwin软件,进去输入gcc -v     make -v   g++ -v 等命令。看能否得到其版本号信息。如不能得到。说明有些工具没有安装,须要又一次安装

未安装的工具(其方法跟前面一样,仅仅是选择你未安装的工具就可以)。

至此cygwin软件算是安装完毕,假设后期使用到新的命令,假设无法使用。则须要又一次安装未安装的工具。

4、安装NDK

a、依照前面给的地址,下载NDK工具软件。

b、将该工具软件解压到某路径下(尽量不要是中文路径,由于在cygwin环境下使用中文不方便)E:\androidNDK\android-ndk-1.6_r1-windows\android-ndk-1.6_r1

c 、打开cygwin软件,首先进入根文件夹下,在使用cd  cygdrive/e/androidNDK/android-ndk-1.6_r1-windows/android-ndk-1.6_r1/ 进入该文件夹下

d、输入build/host-setup.sh 假设出现以下信息说明就成功安装。

5、环境搭建好后。当然就是去编写一个JNI接口怎样调用.SO文件了。过程例如以下

A、e/androidNDK/android-ndk-1.6_r1-windows/android-ndk-1.6_r1/  文件夹下有一个APP文件夹。专门是放NDKproject的,所以我们

在创建ANDROIDproject时指定location位置为e/androidNDK/android-ndk-1.6_r1-windows/android-ndk-1.6_r1/APP/first_jni

创建一个JNI接口类Jin.java,内容例如以下:

package example.dialog.test;

public class Jin {

                public native int add();

                public native String getString();

                }

B、执行DOS命令窗体。进入上述文件的文件夹下,使用 javac  Jin.java  生成Jin.class类

C、执行javah  -jni  包名+Jin.class 命令,最后生成     包名+Jin.h

D、在ANDROIDproject文件夹下创建Jni文件夹,并将前面生成的 包名+Jin.h文件拷贝到该文件夹下,再在此文件夹下新建.c文件,用来实现 包名+Jin.h中的函数。

实现例如以下:

#include<stdio.h>

   #include<stdlib.h>

                   #include"example_dialog_test_Jin.h"

           int add()

   { 

 int x,y;

 x=100;

 y=100;

 return x*y;

   }

JNIEXPORT jint JNICALL Java_example_dialog_test_Jin_add(JNIEnv *env,jobject thiz){

        return add();

}

JNIEXPORT jstring JNICALL Java_example_dialog_test_Jin_getString(JNIEnv *env,jobject thiz){

         (*env)->NewStringUTF(env,"hello world in c!!!");

}

E、JNI通过调用动态链接库(WINDOWS下是DLL,LINUX下是SO)来实现对C\C++方法的调用。因此如今我们就须要将上面写的

C代码编译成SO文件。

编译时须要再从个文件: Android.mk和Application.mk.这两个文件的存放文件夹是有讲究的。前者存在与C文件一个文件夹下,后者

存在ANDROIDproject根文件夹下。

Android.mk  文件的内容一般能够去其他project中去复制过来,内容例如以下:

LOCAL_PATH := $(call my-dir)            //LOCAL_PATH表示此时位于project文件夹的根文件夹,(call my-dir)返回当前文件夹位置。

                       include $(CLEAR_VARS)                    

       LOCAL_MODULE    := NewJNI            //用来区分 Android.mk中的每个模块。文件名称必须唯一。不能有空格,这个是你以后库文件生成的文件名称,编译器会自己主动 给你加上前缀lib和后缀.so. 

                       LOCAL_SRC_FILES := example_dialog_test_Jin.c       //编译时的C文件

                       include $(BUILD_SHARED_LIBRARY)                             //表明生成动态库

Application.mk中的内容:

APP_PROJECT_PATH := $(call my-dir)/firstjni-test

APP_MODULES      := NewJNI                                         //些处的值要与Android.mk中的LOCAL_MODULE中的值一样。

最后启动cygwin进入NDK文件夹。输入make APP=frist_jin,出现以下的界面表示编译成功。

即在E:\androidNDK\android-ndk-1.6_r1-windows\android-ndk-1.6_r1\apps\first-jni\firstjni-test\libs\armeabi  该文件夹下生成了libNewJNI.so动态库。

F、接着我们将在安卓应用程序中使用该库,在上述project下新建一个MyJni.java类,其内容例如以下:

package example.dialog.test;

     import android.app.Activity;

    import android.os.Bundle;

    import android.widget.TextView;

            import example.dialog.test.Jin;

                    public class MyJni extends Activity{

                          private TextView textview;

                          static{

                                System.loadLibrary("NewJNI");

                          }

                      @Override

                      protected void onCreate(Bundle savedInstanceState) {

              // TODO Auto-generated method stub

             super.onCreate(savedInstanceState);

             setContentView(R.layout.main);

             Jin jni = new Jin();

             int result = jni.add();

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

            textview.setText("add()="+result+"\ngetString()="+jni.getString());

                   }

                     }

最后执行应用程序,结果例如以下 图所看到的:

整个project的文件夹例如以下 :

到此,整个过程都已经结束了,可以做到这样,也说明你对JNI接口以及NDK工具的使用算是入门了。

当然在整个过程中会有一些问题,我主要遇到过下面问题:

1、安装好cygwin软件后,用build/host-setup.h时出现GNU无法使用。后来查明了原因是在装cygwin时没有下载GNU以及后面使用的make。又一次下载就好。

2、在使用javah -jni  包名+类名时(且不须要加.class后缀),出现无法找到包名+类名 ,原因是文件夹的层次不正确。应该在包名的上级文件夹使用该命令。

3、在使用make APP=项目目录(而不是生成so文件名称)。

4、在执行模式似是当,被赋予了。他说,参考so文件是空的。后来查询到,由于与第一模拟器 inter atom(x86)的,和.so文件属于ARM系列,更换成功后。

android如何使用自己定义JNI接口,以及NDK环境建设和使用的工具。的更多相关文章

  1. Android : App客户端与后台服务的AIDL通信以及后台服务的JNI接口实现

    一.APP客户端进程与后台服务进程的AIDL通信 AIDL(Android Interface definition language-“接口定义语言”) 是 Android 提供的一种进程间通信 ( ...

  2. Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用

    一.Android平台编程方式:      1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现)      2.自从ndk r5发布以后, ...

  3. Android平台Native开发与JNI机制详解

    源文链接: http://mysuperbaby.iteye.com/blog/915425 一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这 ...

  4. 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)

    原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...

  5. 【转】Android LCD(三):Samsung LCD接口篇

    关键词:android LCD控制器 Framebuffer PWM  平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos ...

  6. Android LCD(三):Samsung LCD接口篇

    关键词:android LCD控制器 Framebuffer PWM  平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:samsung exy ...

  7. Android中添加监听回调接口的方法

    在Android中,我们经常会添加一些监听回调的接口供别的类来回调,比如自定义一个PopupWindow,需要让new这个PopupWindow的Activity来监听PopupWindow中的一些组 ...

  8. Android开发之自定义组件和接口回调

    说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...

  9. java中接口的定义和接口的实现

    1.接口的定义 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interfa ...

随机推荐

  1. 怎样学习java?

    嗯.不知不觉中,学习java的时间快要两年了.在学习这两年中.遇到的挫折非常多,收货的知识也非常多.以下我给出我自己在学习过程中使用到的经验.以及相关的资源链接,希望每个爱编程.爱java的人.能够有 ...

  2. 《深入理解mybatis原理》 MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  3. Android代码混淆和项目宣布步骤记录器

    原本放在一起Android项目与发布的文件相混淆.我突然想到,为什么不写博客,分享.有这篇文章的情况下,. Android代码混淆及项目公布步骤记录 一.清理代码中的调试信息,如Log.System. ...

  4. 11 款最好 CSS 框架 让你的网站独领风骚

    网页设计和发展领域已经成为竞争激烈的虚拟世界.想要在网络的虚拟世界中生存,仅有一堆静止的在线网络应用是远远不够的,网页必须要有很多功能,配以让人无法抗拒的设计.网页编码一定要合适.精确,才能保证不发生 ...

  5. Android显示GIF图片

    今天我们研究一下怎样在Android手机上显示GIF动态图片 首先须要在src文件夹下新建一个自己定义的View.代码例如以下: </pre><pre name="code ...

  6. Erlang cowboy 处理不规范的client

    Erlang cowboy 处理不规范的client Cowboy 1.0 參考 本章: Dealing with broken clients 存在很多HTTP协议的实现版本号. 很多广泛使用的cl ...

  7. MySQL HINT:Straight_JOIN

    来自生产环境的朋友.可能都会碰到:          原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕     一个很大可能的原因就是数据分布情况发生了变化     从而导致MySQL优化 ...

  8. 《转》Linux下的多线程编程

    原地址:http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程 ...

  9. 24位和8位BMP图片保存纯C代码

    BMP图片大家都知道,可以通过查看BMP图片结构使用纯C就可以打开,编辑,处理,保存图片.非常方便使用. 具体BMP结构可以参考:wingdi.h头文件.今天主要在进行删减代码,需要把多余的代码删除, ...

  10. pinyin4j的使用

    pinyin4j的使用   pinyin4j是一个功能强悍的汉语拼音工具包,主要是从汉语获取各种格式和需求的拼音,功能强悍,下面看看如何使用pinyin4j.     import net.sourc ...