《Android框架揭秘》读书笔记——JNI

来源:互联网 发布:鼠标宏编程有啥用 编辑:程序博客网 时间:2024/05/17 23:10
形式 const jbyte* GetStringUTFChars(JNIEnv* env, jstring string, jboolean* usCopy) 说明 将Java字符串对象转换成UTF-8字符串(C字符串),并返回指针 参数 isCopy:当String对象中的祖父穿被转换成UTF-8字符串,被复制到内存,且指针被返回时,*isCopy设置为JNI_TRUE,否则设置为JNI_FALSE。
const char *str = (*env)->GetStringUTFChars(string, 0);
形式 jfieldGetStaticFieldID(JNIEnv* env, jclass clazz, const char* name, const char* signature) 说明 返回对象中指定的静态成员变量的jfieldID的值 参数 clazz:包含成员变量的类的jclass 参数 name:成员变量名 参数 signature:成员变量签名 形式 jfieldGetFieldID(JNIEnv* env, jclass clazz, const char* name, const char* signature) 说明 返回对象中指定的成员变量的jfieldID的值 参数 clazz:包含成员变量的类的jclass 参数 name:成员变量名 参数 signature:成员变量签名 形式 <jnitype> GetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID) 说明 返回clazz类中ID为field的静态变量的值 <type>指Object、Boolean、Byte、Char、Short、Int、Long、Float、Double九种基本类型。 <jnitype>指jobject、jboolean、jbyte、jchar、jshort、jint、jlong、jfloat、jdouble九种基本类型。 形式 <jnitype> Get<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID) 说明 返回clazz类中ID为field的变量的值
fid = env->GetStaticFieldID(clzz, "staticIntField", "I");staticIntField = env->getStaticIntField(clazz, fid);
形式 jclass FindClass(JNIEnv env, const char name) 说明 查找name指定的Java类 形式 jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char* name, const char* signature) 说明 获取clazz类对象的指定方法的ID。注意,方法名(name)与签名应当保持一致。若获取类构造方法的ID,方法名为“<init>” 若方法ID错误,则返回NULL 形式 jobject NewObject(JNIEnv* env, jclass clazz, jmethodID methodID, …) 说明 生成指定类的对象。methodID指类的构造方法的ID 参数 …:传递给类构造方法的参数 返回值 返回类对象的引用。若发生错误,返回NULL
targetClass = env->FindClass(“JniTest”);mid = env->GetMethodID(targetClass, "<init>", "(I)V");newObject = env->NewObject(targetClass, mid, 100);
形式 jobject NewGlobalRef(JNIEnv *env, jobject obj) 说明 为obj指定的类或对象,生成全局引用。当全局引用使用完毕后,应当调用名称为DeleteGlobalRef()的JNI函数,显性地将全局引用销毁。 参数 obj:待生成全局引用的引用值 返回值 返回生成的全局引用,若发生错误,则返回NULL 形式 <jnitype> CallStatic<type>Method(JNIEnv* env, jclass clazz, jmethodID methodID, …) 说明 调用methodID指定的类的静态方法 <type>出了前面的九种类型外,又添加了void类型。返回值类型<jnitype>也增加了void类型。 参数 …:传递给待调用方法的参数 返回值 被调方法的返回值 形式 <jnitype> Call<type>Method(JNIEnv* env, jobject obj, jmethodID methodID, …) 说明 调用methodID指定的Java对象的方法 参数 …:传递给待调用方法的参数 返回值 被调方法的返回值
targetClass = env->GetObjectClass(newObject);mid = env->GetMethodID(targetClass, "callByNative", "(I)I");result = env->CallIntMethod(newObject, mid, 200);
形式 void SetStatic<type>Field(JNIEnv* env, jclass clazz, jfieldID fieldID, <type> value) 说明 设置fieldID指定的Java类静态成员变量的值 形式 void Set<type>Field(JNIEnv* env, jclass clazz, jfieldID fieldID, <type> value) 说明 设置fieldID指定的Java对象的成员变量的值
fid = env->GetFieldID(targetClass, "intField", "I")env->setIntField(newObject, fid, result);
形式 jint JNI_CreateJavaVM(JavaVM **vm, JNIEnv **env, void *vm_args) 说明 装在并初始化Java虚拟机 参数 vm:JavaVM指针的地址 env:JNI接口指针的地址 vm_args:传递给Java虚拟机的参数 返回值 成功,返回0;失败:返回负值 形式 jstring NewStringUTF(JNIEnv* env, const char *bytes) 说明 将UTF-8形式的C字符串转换成java.lang.String对象 返回值 成功,返回String对象的jstring类型的引用;失败,返回NULL 形式 jarray NewObjectArray(JNIEnv* env, jsize length, jclass elementClass, jobject initialElement) 说明 生成由elementClass对象组成的数组。数组元素个数由length指定,initialElement参数用来初始化对象数组 返回值 若成功,则返回数组引用;失败,则返回NULL
#include <jni.h>int main(){    JNIEnv *env;    JavaVM *vm;    JavaVMInitArgs vm_args;    JavaVMOption options[1];    jint res;    jclass cls;    jmethodID mid;    jstring jstr;    jclass stringClass;    jobjectArray args;    // 生成Java虚拟机选项    options[0].optionString = "-DJava.class.path=."    vm_args.versino = 0x00010002;    vm_args.options = options;    vm_args.nOptions = 1;    vm_args.ignoreUnrecognized = JNI_TRUE;    // 生成Java虚拟机    res = JNI_CreateJavaVM(&vm, (void**)&env, &vm_args);    // 查找并加载类    cls = (*env)->FindClass(env, "InvocationApiTest");    // 获取main()方法的ID    mid = (*env)->GetStaticMethodID(env, cls, "main", "([LJava/lang/String;)V");    // 生成字符串对象,用作main()方法的参数    jstr = (*env)->NewString UTF(env, "Hello Invocation API!");    stringClass = (*env)->FindClass(env, "java/lang/String");    args = (*env)->NewObjectArray(env, 1, stringClass, jstr);    // 调用main()方法    (*env)->CallStaticVoidMethod(env, cls, mid, args);    // 销毁Java虚拟机    (*vm)->DestroyJavaVM(vm);}
形式 jint JNI_OnLoad(JavaVM * vm, void * reserved) 说明 Java虚拟机加载本地库时会调用JNI_OnLoad()函数。在使用加载库的过程中,JNI_OnLoad()函数会想Java虚拟机确认JNI的版本。若库中不包含JNI_OnLoad()函数,Java虚拟机会认为相关库要求JNI1.1版本支持。 形式 jint GetEnv(JavaVM* vm, void ** env, jint version) 说明 判断Java 虚拟机是否支持version指定的JNI版本,而后将JNI接口指针设置到*env中 返回值 若执行成功,返回0;失败,返回负数 形式 jarray RegisterNatives(JNIENv * env, jclass clazz, const JNINativeMthod * methods, jint nMethods) 说明 将clazz指定类中的本地方法与JNI本地函数连接在一起,链接信息保存在JNINativeMthod结构体数组中 返回值 若执行成功,返回数组引用;否则,返回NULL
#include "jni.h"#include <stdio.h>void printHelloNative(JNIEnv* env, jobject obj);void printStringNative(JNIEnv* env, jobject obj, jstring string);JNIExport jni JNICALL JNI_OnLoad(JavaVM *vm, void * reserved){    JNIEnv* env = NULL;    JNINativeMethod nm[2];    jclass cls;    jint result = -1;    if(vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {        printf("ERROR");        return JNI_ERR;    }    cls = env->FindClass("HelloJNI");    nm[0].name = "printHello";    nm[0].signature = "()V";    nm[0].fnPtr = (void *)printHelloNative;    nm[1].name = "printString";    nm[1].signature = "(Ljava/lang/String;)V";    nm[1].fnPtr = (void *)printStringNative;    env->RegisterNatives(cls, nm, 2);    return JNI_VERSION_1_4;}
0 0
原创粉丝点击