【Android】Android中使用JNI调用底层C++代码

Android NDK是一系列工具的集合。帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so动态链接库文件

JNI编译环境配置

有2种方式来实现编译jni工程:
方法一:
在ADT的菜单windows->preferences->Android->NDK设置NDK的路径,同时在工程的属性中,选择默认ndk编译。

方法二:
在ADT的菜单windows,属性,build中设置NDK的路径。同时在系统环境变量中配置NDK_ROOT以及路径,然后在工程的属性中,不选择默认NDK,输入编译指令

这里按第一种方式来配置JNI的编译环境:
先下载NDK,然后解压。下载链接:
http://pan.baidu.com/s/1o6OnOp0

设置过程如下图所示:

配置NDK的路径为解压路径即可

示例工程建立

创建JNI的接口类

接口类的位置在src目录下的任意一个包中


    package com.example.testndk01;

    public class JniClient {

        static public native String getName();
    }

编译接口类

进入项目文件夹, 生成JNI的头文件, 使用如下的编译命令:

javah -classpath bin/classes -d jni com.example.testndk01.JniClient
也可以直接到工程的classes目录下使用 javah -d jni com.example.testndk01.JniClient 编译

编译完成之后会生成一个com_example_testndk01_JniClient.h头文件,该头文件是根据JniClient.java文件生成的,该文件中含有native方法。

配置Android项目的NativeSupport

右键工程->Android Tools,点击Add NativeSupport,输入一个文件名,之后会生成jni文件夹和两个新的文件。这里生成的是TestNDK01.cpp文件和Android.mk,TestNDK01.cpp文件是和com_example_testndk01_JniClient.h头文件对应的一个C++实现。Android.mk文件是一个Makefile文件,IDE自动生成的,可以不用修改。

添加Native方法的C++实现

直接返回一个字符串


    #include <jni.h>
    #include <com_example_testndk01_JniClient.h>

    JNIEXPORT jstring JNICALL Java_com_example_testndk01_JniClient_getName
      (JNIEnv *env, jclass) {
        return env->NewStringUTF("just a NDK test");
    }

添加实现方法的时候.h文件或者.cpp文件可能会出现“Unresolved inclusion jni.h”问题,解决办法参考:

使用编译生成的.so动态链接库文件

在自己的Android应用中加载编译的动态链接库文件,注意不许要添加lib前缀和.so后缀


    static {
        System.loadLibrary("TestNDK01");
    }

加载了库文件之后就可以使用C++提供的方法了,这里示例代码的是一个返回字符串函数,如下:


     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            TextView tv_name = (TextView) findViewById(R.id.tv_name);
            tv_name.setText(JniClient.getName());
        }

在onCreate方法中,将JniClient中的getName() (该方法的实际实现就是使用底层C++代码实现的)返回的字符串设置到一个textView控件中。

执行结果:

【Android】Android中使用JNI调用底层C++代码_第1张图片

示例工程文件结构如下:

参考:

http://blog.csdn.net/wangjianzhongfj/article/details/39139497
http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html

你可能感兴趣的:(java,apk,android,jni)