AndroidStudio Jni 开发初识

NDK 是什么?

NDK是一系列工具的集合,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk

为什么使用NDK

  • 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
  • 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
  • 便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

开始使用

下载ndk环境的这里不赘述了

添加jni文件夹

这里写图片描述

在app下的build.gradle加入ndk的配置

这里写图片描述

写调用代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView) findViewById(R.id.tv_hello);
        textView.setText(strFromC());
    }

    //声明一个native方法
    public native String strFromC();

    //静态代码块里加载native方法的so库,名字和之前定义的一样
    //ps:静态代码块里面的代码在类初始化时会最新被加载
    static {
        System.loadLibrary("hello_c");
    }
}

生成.h头文件

到调用类那个文件夹下执行javah命令

这里写图片描述

javah的更多用法

这里写图片描述

在同级目录下会生成报名+类名的头文件,之后将其拖拽到jni文件下,并创建一个c文件

这里写图片描述

com_simplepeng_jnidemo_MainActivity.h

没有c基础的可以暂时不了解其中的用法和含义

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_simplepeng_jnidemo_MainActivity */

#ifndef _Included_com_simplepeng_jnidemo_MainActivity
#define _Included_com_simplepeng_jnidemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_simplepeng_jnidemo_MainActivity
 * Method:    strFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

hello_c.c

没有c基础的可以暂时不了解其中的用法和含义

//包含生成的.h头文件
#include "com_simplepeng_jnidemo_MainActivity.h"
//*env 指向 JNINativeInterface 结构的指针
//obj 指向void* 
//所有的都可以在jni.h中找到
JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC
        (JNIEnv *env, jobject obj) {
    const char *str = "hello from c";
    return (*env)->NewStringUTF(env, str);
}

编译项目,生成so库

这里写图片描述

这里写图片描述

正确生成so库后就可以运行项目查看native方法是否调用成功

这里写图片描述

可以看到是成功调用到了native的方法的。

其他注意事项

在builde.gradle中配置了ndk自己就生成了Android.mk
如果报没找到ndk相关配置错误,可能就需要自己在local.properties中配置ndk的目录

ndk.dir=/Users/simple/Library/Android/sdk/ndk-bundle

或者报ndk版本问题,可能也需要在gradle.properties中配置

android.useDeprecatedNdk=true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值