Android中的NDK(一)

Android NDK是一系列的开发工具,允许程序开发人员在Android应用程序中嵌入C/C++语言编写的代码。

1、配置
这里写图片描述
配置环境变量
这里写图片描述

使用ndk-build来测试是否配置好

Android NDK 新建时 include C++project

这里写图片描述

2、构建系统
Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := src/main/jni/com_netease_study_jni_JNIDemo.c \
                    src/main/jni/com_netease_study_jni_UserInfo.c

LOCAL_LDLIBS += -llog

LOCAL_MODULE := MyJNIDemo

include $(BUILD_SHARED_LIBRARY)

3、JNI数据类型

    JNI系统类型:JNIEnv(线程上下文)
    基本数据类型
    引用类型
    数组

这里写图片描述
数据类型映射关系
这里写图片描述

这里写图片描述

4、基类数据类型的使用

//基本类型的使用
void JNICALL Java_com_netease_study_jni_JNIDemo_printfInt
        (JNIEnv *env, jobject instance, jint i){
    int index = 0;
    for(;index<i;index++){
        printf("%d",index);
    }
}

jstring的使用

//string的使用
 void  JNICALL Java_com_netease_study_jni_JNIDemo_printfStr
        (JNIEnv *env, jobject obj, jstring str){

    const char* charStr =
            (*env)->GetStringUTFChars(env,str,NULL);
    if(charStr ==NULL)
        return;
    printf("%s",charStr);
    (*env)->ReleaseStringUTFChars(env,str,charStr);
}

jni内部描述
这里写图片描述

jobject使用

    对象的创建
    字段的读写
        静态字段
        实例字段
    方法的调用
        静态方法
        实例方法

(1)字段读写
这里写图片描述

//将message.what的值修改成-1

void  Java_com_netease_study_jni_JNIDemo_changeMessageWhatInNative
        (JNIEnv *env,jobject instance,jobject msg) {
    //获取message jclass
    jclass  cls = (*env)->GetObjectClass(env,msg);
    //获取message.what jfieldID
    jfieldID whatField =
            (*env)->GetFieldID(env,cls,"what","I");
    //将message.what设置成-1
    (*env)->SetIntField(env,msg,whatField,-1);

    int iWhat =(*env)->GetIntField(env,msg,whatField);
    printf("%d",iWhat);
}

(2)方法调用
这里写图片描述

//调用Message.obtain获取Message
jobject  Java_com_netease_study_jni_JNIDemo_getMessageFromNative
        (JNIEnv *env,jobject instance){
    jclass cls = (*env)->FindClass(env,"android/os/Message");
    jmethodID  obtainMethod =
            (*env)->GetStaticMethodID(
                    env,cls, "obtain","()Landroid/os/Message;");
    return   (*env)->CallStaticObjectMethod(env,cls,obtainMethod);
}

(3)创建对象
这里写图片描述

//调用new Message获取Message
jobject  Java_com_netease_study_jni_JNIDemo_newMessageFromNative
        (JNIEnv *env,jobject instance){
    jclass cls = (*env)->FindClass(env,"android/os/Message");
    jmethodID initMethod = (*env)->GetMethodID(env,cls,"<init>","()V");
    return   (*env)->NewObject(env,cls,initMethod);
}

(4)数组操作

//设置数组元素
void Java_com_netease_study_jni_JNIDemo_changeMessageArrays(JNIEnv *env,jobject instance,jobjectArray objArray){

    jclass cls = (*env)->FindClass(env,"android/os/Message");
    jfieldID whatField =
            (*env)->GetFieldID(env,cls,"what","I");

    jsize  length = (*env)->GetArrayLength(env,objArray);
    int index= 0;
    for(;index<length;index++){
        //按索引值取出数组元素
         jobject element =  (*env)->GetObjectArrayElement
                 (env,objArray,index);
        (*env)->SetIntField(env, element,whatField,-2);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值