Android Studio 编写 JNI

之前一直都不知怎么编写JNI,今天刚好学习一下,感谢梦真的指教,以及提供的文档。

参考链接

  http://blog.csdn.net/u011168565/article/details/51878176

  http://www.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

创建一个jni类(.java文件)

  1. 创建Android studio 工程

  2. 切换到project视图

  3. 创建jni类如下所示

package com.example.tony.jnidemo;

/**
 * Created by Tony on 2016/7/19.
 */
public class JNITest {
    public native String getJNIString(); // jni接口函数
    static {
        System.loadLibrary("hello-jni"); //加载jni动态库,只写库名,库名称是在build.gradle中指定的。
    }
}

生成.class文件

  点击导航栏build-> Make Module "app", 编译jni类(.java文件),生成.class文件

  生成的.class文件在app/build/intermediates/classes/debug目录中

生成.h文件

  1. 打开终端,切换到debug目录

  JNIDemo\app\build\intermediates\classes\debug

  2. 在debug目录下生成.h文件

   在终端输入命令

    javah com.example.tony.jnidemo.JNITest    
        //com.example.tony.jnidemo是包名,JNITest是类名;

   在debug目录下,生成文件com_example_tony_jnidemo_JNITest.h

编写jni源代码

  1. 复制debug目录的.h文件

  2. 在app/src/main目录下创建jni目录(一定要是小写的)

  3. debug目录中的.h文件粘贴到jni目录中。

  4. 在jni目录中创建.c文件,文件名称自己取。

  5. 复制.h文件中的内容到.c文件中。并实现其中的函数,如下所示,返回一个jstring类型。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_tony_jnidemo_JNITest */

#ifndef _Included_com_example_tony_jnidemo_JNITest
#define _Included_com_example_tony_jnidemo_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_tony_jnidemo_JNITest
 * Method:    getJNIString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_tony_jnidemo_JNITest_getJNIString
        (JNIEnv *env, jobject thisObj) {
        return (*env)->NewStringUTF(env,"Hello World");
}

#ifdef __cplusplus
}
#endif
#endif

配置gradle文件

  打开buidle.gradle,添加ndk内容,指定动态库名称和处理器架构

defaultConfig {  
        applicationId "com.example.aplex.jnidemo"  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        ndk{  
        //在JNI打log 必须加上log,否则会报错log函数未定义,
            ldLibs "log"
        //指定生成模块名字,也就是最终的动态库名hello-jni,相应库文件名libhello-jni.so moduleName "hello-jni"  
            moduleName "hello-jni"  
        // 指定生成哪些处理器架构的动态库文件,如果要运行在x86架构处理器一定需要指定 abiFilters "armeabi" , "x86"  
            abiFilters "armeabi" , "x86"  
        }  
  
    }  

添加ndk

  打开gradle.properties在文件最后添加。

  android.useDeprecatedNdk=true

  否者编译会出错。

至此,jni编写完毕,点击导航栏中的图标(Sync Project with Gradle Files),生成gradle文件,就可以调用JNI的类了。

Author

  Tony Liu

  2016-7-19, Shenzhen

posted @ 2016-07-19 23:28  SuperTao1024  阅读(1039)  评论(0编辑  收藏  举报