NDK基本开发及适用场景

IDE:Android Studio 1.3
操作系统:Ubuntu 14.04 LTS

基本使用

  • 1.去官网下载NDK,配置好路径
  • 2.新建JNIClass文件来写Java类
public class HelloClass {
    static {
        System.loadLibrary("app"); // module的名字
    }
    public native String  stringFromJNI(); // 声明本地方法
}
  • 3.编译一下,build -> project ,生成类文件
    进入app/build的文件夹可查看.class 文件
    例如我的路径:
    /home/zero/Downloads/NDK/app/build/intermediates/classes/debug/
  • 4.切换到终端,进入到main目录下(到时jni文件直接输入到该目录下)
  • 5.使用javah生成头文件
    命令
    javah -d jni -classpath ../../build/intermediates/classes/debug com.zero.ndk.JNIClass.HelloClass
    会发现main目录下多了一个jni,里面有一个.h文件
  • 6.编写.c或.cpp 文件,在jni下新建一个源文件,方法名一定要从.h中复制过来
#include <string.h>
#include <jni.h>
jstring Java_com_zero_ndk_JNIClass_HelloClass_stringFromJNI( JNIEnv* env, jobject thiz )
{
    #if defined(__arm__)
        #if defined(__ARM_ARCH_7A__)
          #if defined(__ARM_NEON__)
            #if defined(__ARM_PCS_VFP)
              #define ABI "armeabi-v7a/NEON (hard-float)"
            #else
              #define ABI "armeabi-v7a/NEON"
            #endif
          #else
            #if defined(__ARM_PCS_VFP)
              #define ABI "armeabi-v7a (hard-float)"
            #else
              #define ABI "armeabi-v7a"
            #endif
          #endif
        #else
         #define ABI "armeabi"
        #endif
    #elif defined(__i386__)
        #define ABI "x86"
    #elif defined(__x86_64__)
        #define ABI "x86_64"
    #elif defined(__mips64)  /* mips64el-* toolchain defines __mips__ too */
        #define ABI "mips64"
    #elif defined(__mips__)
        #define ABI "mips"
    #elif defined(__aarch64__)
        #define ABI "arm64-v8a"
    #else
    #define ABI "unknown"
    #endif
    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");
}
  • 7.在project下的local.properties添加ndk路径
    ndk.dir=/home/zero/android_zip/android-ndk-r10e
  • 8.build project,会在build/intermediates/classes/ndk下面查看到不同设备的.so动态库(windows下为.dll)
  • 9.开始使用吧!
    mJNITv = (TextView) findViewById(R.id.ndk_tv);
    HelloClass jniFunc = new HelloClass();
    mJNITv.setText(jniFunc.stringFromJNI());
  • 运行无误,这里就不贴图了。

说明

    defaultConfig {
        applicationId "com.zero.ndk"
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk {  // 注意添加这个配置,不然方法会显示红色,但运行不会报错
        }
    }

关于如何编写C函数就要靠自己去学习咯

为了使用JNI,专门定义了一套接口例如jstring替代String

使用目的

  • 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大
  • 提高应用程序的执行效率
  • 使用现存的C/C++开源库

使用场景

  • 加密处理
  • 影音方面
  • 图形图像处理

推荐教程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值