android jni学习

参考 

http://www.cnblogs.com/flyme/p/4431762.html

http://blog.csdn.net/sodino/article/details/41946607

 Android的JNI开发有两种情况:一种是使用已经编译好的so动态库,别外一种是使用c/c++源码开发。下面分别介绍使用方法。

一、使用已经编译好的so 

这种情况下,只要将.so文件放到相应的目录就可以了。在编译后,so文件会自动打包到apk中,在代码中直接loadLibrary就可以了。如下图

使用方法:

String libName = "helloNDK";//注意没有lib前缀和.so后缀

System.loadLibrary(libName);

二、使用C/C++源码 

  • 编写java源码 

  • 生成class文件

执行build--->make project,生成class文件,文件存放于下面的目录中。

  • 生成.h头文件

在AS的terminal中使用javah命令生成头文件。我们要使用的是

javah -d <dir> -classpath <path>

-d:生成头文件存放的目录(这个目录如果事先没有,那么运行时会创建。

<dir> :-d选择的头文件存放的目录。

-classpath:从中加载类的路径命令。

<path>:是需要生成头文件的class文件的目录。

首先要cd到HelloNDK.java的文件夹main,如果不进行这个目录就运行javah时会提示找不到相关的类文件。

在切换到了main目录后,执行

javah -d jni -classpath ..\..\build\intermediates\classes\debug  chuiyuan.lsj.androidjava.jni.HelloNDK

其中

jni:生成的头文件要保存的目录。

..\..\build\intermediates\classes\debug:class所在的目录。

最后一个是class文件名。

运行成功后,得到如下图

.h头文件出现了,它是自动生成的,不能进行改动。

  • 编写C/C++源文件

函数名一定要从头文件中复制过来,以免出错。

得到的如下所示

//
// Created by lsj on 2015/9/18.
//
#include <jni.h>
#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

//copy from header file
#ifndef _Included_chuiyuan_lsj_androidjava_jni_HelloNDK
#define _Included_chuiyuan_lsj_androidjava_jni_HelloNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     chuiyuan_lsj_androidjava_jni_HelloNDK
 * Method:    syaHello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_chuiyuan_lsj_androidjava_jni_HelloNDK_syaHello
        (JNIEnv *env, jobject jObj) {
    LOGE("log string from ndk");
    return (*env)->NewStringUTF(env, "Hello from JNI");
}

#ifdef __cplusplus
}
#endif
#endif
  • 配置app里面的build.gradle文件

 如图,加入ndk的配置。

  • 配置ndk的路径

要先下载,还是很大的。

  • 最后生成 so文件

  • 在Activity中测试jni

 

posted @ 2015-09-19 10:18  chuiyuan  阅读(181)  评论(0编辑  收藏  举报