Android Studio JNI使用实例

23 篇文章 0 订阅
15 篇文章 0 订阅



一、Android JNI简介

    JNI(Java Native Interface)提供了若干的API实现了Java与其他语言的通信(主要是CC++)。从Java1.1开始,JNI标准成为Java平台的一部分,允许Java与其他语言进行交互。由于JNI是本地编程接口,通常为了与硬件、操作系统交互,或者为了提高程序的性能,在JVM内部运行Java代码使得能够和其他的语言进行交互,但也会丧失平台的可移植性。


二、JNI优缺点

    1.优点:

      (1)性能得到较大的提高

      (2)效率高

      (3)使用方便

      (4)本地代码,为JavaC/C++/汇编建立了一个桥梁


    2.缺点:

      (1)丧失可移植性

      (2)安全性降低

      (3)耦合性下降


三、JNI使用场景

  1.JAVA程序和本地程序使用TCP/IP或者IPC进行交互。

2.当用JAVA程序连接本地数据库时,使用JDBC提供的API

3.JAVA程序可以使用分布式对象技术,如JAVA IDL API


这些方案的共同点是JavaC处于不同线程,或者不同的机器上。这样的做法好处在于,当本地程序崩溃时,不会影响到Java程序。


下面这些场景中,同一进程内JNI的使用无法避免:

1.程序当中用到了JAVAAPI不提供的特殊系统环境才会有的特征。而跨进程操作又不现实。

2.你可能想访问一些己有的本地库,但又不想付出跨进程调用时的代价,如效率,内存,数据传递方面。

3.JAVA程序当中的一部分代码对效率要求非常高,如算法计算,图形渲染等。

 

四、JNINDK的关系

JNIJava语言提供的JavaC/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI是本地编程接口,JavaC/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将sojava应用一起打包成apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出哪些文件需要编译编译特性要求等),就可以创建出so。它可以自动地将soJava应用一起打包,极大地减轻了开发人员的打包工作。 


五、下载、配置NDK

AndroidStudio2.0以后,Android Studio自带NDK插件,不需要另外下载NDK再进行配置,开发工具均已配置好。




下载地址:http://www.androiddevtools.cn/


 

1.新建Project,选择Includec++ Support选项,创建空白Activity,直至Finish,创建成功。




2.自动生成cpp文件夹和native-lib.cpp文件,不需另外启用终端生成,开发工具均已自动完成。






3.local.properties下配置NDK关联,关联地址不统一。

ndk.dir=D\:\\software\\android\\android-sdk\\ndk-bundle
sdk.dir=D\:\\software\\android\\android-sdk


六、开发步骤


1.MainActivity中添加关联native-lib.cpp中的方法。

// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}

/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 */
public native int stringFromJNI(int i, int j);


2.native-lib.cpp中实现C/C++/汇编代码,构造方法。

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

extern "C"
int
Java_com_example_jnidemo_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject obj, int i, int j /* this */) {
//    std::string hello = "Hello from C++";
//    return env->NewStringUTF(result.c_str());

    int y = i * j;
    return y;
}



3.Activity中进行调用方法。

// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
String mStrResult = "1 * 3 = " + stringFromJNI(1, 3);
tv.setText(mStrResult);



七、实现效果图


八、源码下载

下载地址:http://download.csdn.net/detail/u012721519/9769975








Good luck!

Write by Jimmy.li













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值