• 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 ....uildintermediatesclassesdebug  chuiyuan.lsj.androidjava.jni.HelloNDK

    其中

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

    ....uildintermediatesclassesdebug: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

  • 相关阅读:
    点击按钮显示隐藏层 和 切换按钮同时显示多个隐藏层
    CSS3混合模式background-blend-mode
    阿里云服务器出现Warning: Cannot modify header information
    谷歌浏览器,添加默认搜索引擎的搜索地址
    常用的php数组函数
    array_map,array_filter,array_walk区别
    当一个按钮点击不了时,鼠标可以自定义的样式
    滚动到页面底部触发分页事件
    表单提交,不合法表单元素标签的高亮、页面上滚到某一个元素的位置
    表单提示输入,边框颜色渐变
  • 原文地址:https://www.cnblogs.com/chuiyuan/p/4821009.html
Copyright © 2020-2023  润新知