Android NDK编程

环境

  • 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编程)