Android Studio下NDK开发

Android Studio下NDK开发

AS下NDK开发步骤:

  • 配置NDK

  • 生成class文件

  • 生成.h头文件

  • *gradle配置

  • 测试


配置NDK

  • 这里写图片描述

    在这里配置好下载的NDK,并在local.properties生成

    ndk.dir=E:\\Tools\\android-sdk-windows\\ndk-bundle

生成class文件

新建JNITest.java实现native方法

public class JNITest {

    static { //载入名为“Test”的C++库
        System.loadLibrary("Test");
    }
    public native int add(int a, int b);

    public native double mulDouble(double a, double b);
}

然后build->make project会在app/build下生成classes,如果没有请重试

生成.h头文件

有了class文件就可以生成 .h头文件了

  • 打开Terminal输入指令
cd app/build/intermediates/classes/debug

javah -jni com.harry.test.ndk.JNITest
  • 这里javah -jni后面跟的是JNITest类的全路径,如果javah报不存在之类的,是你的java环境没有配置好。

  • 打开classes/debug下面的文件发现多了一个文件
    com_harry_test_ndk_JNITest.h

  • 然后在src/main下新建文件夹jni,把生成的.h文件复制或者剪切到jni文件夹下面去,新建一个c类随便取一个名字 如 myjni.cpp(NEW->C/C++ Source File),添加代码如下

#include "com_harry_test_ndk_JNITest.h"
JNIEXPORT jint JNICALL Java_com_harry_test_ndk_JNITest_add
        (JNIEnv *env, jobject obj,jint a,jint b){ 
   return a+b;
   }

JNIEXPORT jdouble JNICALL Java_com_harry_test_ndk_JNITest_mulDouble
        (JNIEnv *env, jobject obj,jint a,jint b){ 
   return a*b;
   }

gradle配置

  • gradle.properties
android.useDeprecatedNdk=true
  • build.gradle
ndk {
    moduleName "Test"          //生成的so名字
    abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,目前可有可无。
    }

测试

JNITest jni = new JNITest();

int res=jni.add(10, 20);

Log.e("TestJNI", "10+20=" + res);

double r=jni.mulDouble(10.88, 20.0);

Log.e("TestJNI", "10.88*20.0=" + r);

这里写图片描述

到此,简单的ndk开发结束了

补充

  • 在JNITest.java添加native方法,需重新生成class文件

  • 打开app->intermediates-ndk-debug发现生成了三个文件夹,并且对应了之前我们在build.gradle配置的abiFilters,将该三个文件夹放入app/libs,删除jni文件夹试试这里写图片描述

PS:处理非基本数据类型

  • 处理java String对象
    native 方法
public native String getStr(String str);
JNIEXPORT jstring JNICALL Java_com_harry_test_ndk_JNITest_getStr
        (JNIEnv *env, jobject, jstring str){
        //获得string对象
  const char *nativeString = env->GetStringUTFChars(str, 0);
  //DON'T FORGET THIS LINE!!!
  //释放string对象
  env->ReleaseStringUTFChars(str, nativeString);
  return str;
}
  • 处理java int[] 数组

native 方法

public native int[] convert(int[] ids);
JNIEXPORT jintArray JNICALL Java_com_harry_test_ndk_JNITest_convert
        (JNIEnv *env, jobject, jintArray array) {
    jint buf[10];
    jint i;
    env->GetIntArrayRegion(array, 0, 10, buf);
    jint j = 0;
    //元素 平方值输出
    for (i = 0; i < 10; i++) {
        j = buf[i];
        j *= j;
        buf[i] = j;
    }
    env->SetIntArrayRegion(array, 0, 10, buf);
    return array;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值