JNI初试

这几天学习了一下JNI,在此记录一下!

准备

  • 下载NDK并配置环境变量
  • 新建android项目JNITest,然后app->new->Folder->JNI Folder在src/main目录下生成jni
    这里写图片描述
  • 修改local.properties,添加ndk目录 ndk.dir=D:\\Android\\ndk
  • 修改gradle.properties,添加 android.useDeprecatedNdk=true

生成c文件

  • 创建Hello.java类,然后创建native方法 public native String hello();
  • build项目,生成class文件,然后执行javah生成头文件
    这里写图片描述
  • 将生成的头文件copy到jni目录,并创建编写.c文件
#include "demo_cxs_com_ndktest_Hello.h"

JNIEXPORT jstring JNICALL Java_demo_cxs_com_ndktest_Hello_hello(JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"hello world");
}

编译生成动态库有两种方式,如下:

方式一:这种方式只需配置gradle,不用Android.mk和Application.mk,这样编译项目时会自动把jni目录下的所有文件编译生成jnihello.so库,生成的so库是在build下面,可通过查找.so查看
  • 在build.gradle中设置ndk
defaultConfig {
        applicationId "demo.cxs.com.ndktest"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        ndk{
            moudleName "jnihello"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
    }
方式二:需要手动执行ndk-build命令生成.so,这种方式可以在需要生成多个so库时执行多次来完成,而且生成的库目录比较明确,容易找到
  • 在jni目录下添加Android.mk(指明编译依赖和步骤)和Application.mk(指明适配的架构类型)
  • 在cmd中,cd到jni目录,执行ndk-build,会自动生成src/main/libs目录,并在libs中生成so库
    这里写图片描述

  • 将src/main/libs中的so库copy到libs目录下

  • 在build.gradle中添加如下,指明so库的路径
sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

调用

  • 需在Hello.java文件中加载库,切记库名要和上面的moudleName一致
static {
        System.loadLibrary("jnihello");
    }
  • 调用的代码如下
TextView tv = (TextView)findViewById(R.id.tv_hello);
Hello hello = new Hello();
tv.setText(hello.hello());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值