JNI开发入门

来源:互联网 发布:詹姆斯生涯数据最新 编辑:程序博客网 时间:2024/05/18 03:05
  • 声明:转载请注明出处:http://blog.csdn.net/hello_chillax/article/details/46680913
  • 更多精彩请访问:http://blog.csdn.net/hello_chillax,谢谢

学Android有一段时间的朋友大部分听过类似NDK,JNI之类的概念。那么这到底是什么意思呢,以及其作用和使用方法呢,今天咱们就来讲一讲这些知识。

一.概念理解。

1.jni:Java native interface:Java本地接口
2.ndk:native development kit:本地开发工具集
3.jni和ndk的关系:ndk是个工具包,就像是sdk一样,为jni开发提供许多的工具。

二.Android开发中,jdk加sdk这么强大的API支持,为何还需要jni呢。

1.jni用c/c++语言开发,执行效率比Java高一些。
2.用jni实现的逻辑代码很难被反编译破解,是Android中加密操作的首选。
3.用jni开发的代码可移植性非常好。

三.jni开发流程(用一个小项目讲解)

1.我们选用eclipse进行开发。首先,需要做两件事情:

  1. 下载并解压ndk。
    密码:5gtw
  2. 配置环境变量。
    打开环境变量“path”,在末尾添加ndk的路径(如果末尾没有分号,需要先添加一个分号,然后再添加ndk的路径)
    比如我的路径是:D:\android-ndk-windows

2.第二我们要开始写代码了。。(实现的功能:点击button,调用c代码弹出一个Toast)

  1. 创建一个工程,打开MainActivity:
  2. 在MainActivity中定义native方法,并监听点击事件。
//用native关键字来声明这是一个本地方法,需要用c语言实现public native String helloFromC();//当点击button时调用这个方法,Toast中调用helloFromC()这个方法。    public void click(View view) {        Toast.makeText(this, helloFromC(), 0).show();    }
  1. 实现本地c语言方法。
    看一看使用了jni之后的工程目录,是不是多了几个文件夹:jni,libs,obj
    这里写图片描述

这些东西可以用命令行实现:
ndk-build.cmd

但是往往命令行操作是一件令人头疼的事,这里详细说一下另外一种比较简单的方式:
为了实现这个功能,我们需要先去下载一个eclipse插件:ndk.jar.
但是这个jar包是需要翻墙下载的,这里给提供一个已经下载好的,密码:uw8l,把它直接放到你的这个路径下,然后重启eclipse即可。adt-bundle-windows\eclipse\plugins

  1. 上面的东西整好之后,我们只需要一步,就能做到和命令行一样的效果。
  2. 对着项目名点击右键-》Android Tools-》add native support;
    出现如下对话框。
    这里写图片描述

注意:这里要生成一个.so文件,这个.so文件里就是c语言实现的逻辑,它难以反编译,所以比较安全

随便输入一个名字,比如hello,点击确认。(这个名字就是你的c语言文件的名字,不重要);

好了,到此,就可以开始写c代码了,比如:

#include <jni.h>jstring Java_com_example_jni_MainActivity_helloFromC(JNIEnv* env,jobject obj){    return (**env).NewStringUTF(env,"我的第一个jni底层调用~");}

恩,没错,这就是c代码,看着是不是非常无语,咱们先不管这个,先把功能实现了,回过头来仔细讲一下这个c代码的意思,以及为何要这么写。

3.最后三行代码。。。

上面的内容,主要说明了一下如何创建jni环境,如何写Java代码,如何写c代码。然后剩下的就是调用了,在MainActivity.java中添加下面的代码,来引入c代码库

static{//加载刚才产生的hello.so        System.loadLibrary("hello");    }

ok ,完事了,如果大家跟上了节奏的话,应该是已经可以实现调用了,至于结果的截图,发一个静态的吧,
这里写图片描述

四.遗留问题的解决。

我们还剩下两个问题:
1.上面的c代码还没说明
2.上面的程序只能在arm机器上运行,不能在x86的机器上运行;

解决问题一:

先把c代码拷一份:

#include <jni.h>jstring Java_com_example_jni_MainActivity_helloFromC(JNIEnv* env,jobject obj){    return (**env).NewStringUTF(env,"我的第一个jni底层调用~");}

1.首先,Java语言和C语言本来就是不通的语言,一些数据类型完全不同,比如Java中有String的概念,而c中没有String的概念,所以,需要进行相应的转换。

2.库函数 #include

0 0
原创粉丝点击