Android NDK编程

作者: 世外大帝 | 来源:发表于2017-11-27 18:06 被阅读32次

    环境

    • Android Studio 3.0
    • JDK 1.8
    • Gradle 4.1

    Demo地址:

    https://github.com/seeways/NDKDemo

    C++编译so库

    http://blog.csdn.net/lftaoyuan/article/details/78645814

    C编译so库

    创建项目

    C++编译so库中已经有了创建后的示例,不多赘述。

    建立MyJNI类

    package com.test.ndkdemo;
    
    /**
     * Created by TaoYuan on 2017/11/24 0024.
     */
    
    public class MyJNI {
        //调用so库声明
        static {
            System.loadLibrary("MyJNI");
        }
    
        /**
         * 调用so库方法
         */
        //输出字符串
        public native String sayHello();
    
        //输出 x+y 计算结果
        public native int sum(int x, int y);
    
        //接收byte数组,输出json信息
        public native String receiveYUV(byte[] bytes);
    
    }
    
    
    

    然后make project,这是在C++同一个项目下生成的,所以先忽略cmake生成的文件,

    设置快速工具,当然也可以直接用命令,如果不怕麻烦的话

    [图片上传失败...(image-c9c96c-1511777538224)]

    [图片上传失败...(image-dc9f0d-1511777538224)]

    • javah

      • Program:
        $JDKPath$\bin\javah.exe
      • Parameters:
        -classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$
      • Working directory: $ModuleFileDir$\src\main\Java
    • ndk-build

      • Program:
        你的ndk地址\ndk-build.cmd
      • Working directory: $ProjectFileDir$\app\src\main

    生成后,会出现jni文件夹,里面有根据MyJNI生成的头文件,然后新建C文件就可以写C代码了

    可以考虑直接把头文件里的方法名直接复制过来,然后编写逻辑

    //
    // Created by TaoYuan on 2017/11/24 0024.
    //
    
    #include "com_test_ndkdemo_MyJNI.h"
    
    JNIEXPORT jstring JNICALL Java_com_cyyz_ndkdemo_MyJNI_sayHello(JNIEnv *env, jobject instance){
    
        return (*env)->NewStringUTF(env,"say 就 say!\n Hello");
    
    }
    
    
    JNIEXPORT jint JNICALL Java_com_cyyz_ndkdemo_MyJNI_sum(JNIEnv *env, jobject instance, jint x, jint y){
        return x + y;
    }
    
    JNIEXPORT jstring JNICALL
    Java_com_test_ndkdemo_MyJNI_receiveYUV(JNIEnv *env, jobject instance, jbyteArray bytes_) {
        jbyte *bytes = (*env)->GetByteArrayElements(env, bytes_, NULL);
        if (bytes == NULL) {
            return 0; /* exception occurred */
        }
    
        //do something...
    
        char *say = "输出的json数据";
        (*env)->ReleaseByteArrayElements(env, bytes_, bytes, 0);
        return (*env)->NewStringUTF(env, say);
    }
    
    

    配置gradle

    modules build.gradle

    • moduleName:so名称
    • abiFilters:cpu架构
    • ldLibs:连接库
    • cFlags:编译选项,C++里是cppFlags
    • stl: C++运行库
        ndk{
            moduleName "MyJNI"
            abiFilters "armeabi","armeabi-v7a"
        }
    

    生成makefile

    1. make project
    2. ${ProjectPath}\app\build\intermediates\ndk下会生成Android.mk
    3. copy到jni文件夹下
    4. 用刚才配置的ndk-build构建Android.mk
    5. finish
      [图片上传失败...(image-ae357e-1511777538224)]

    相关文章

      网友评论

        本文标题:Android NDK编程

        本文链接:https://www.haomeiwen.com/subject/xcwdbxtx.html