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);
}