哪个品牌网站设计感强,做充气气模产品一般去哪些网站,网页制作需要哪些软件,地图怎么认证地址本地代码中使用Java对象通过使用合适的JNI函数#xff0c;你可以创建Java对象#xff0c;get、set 静态(static)和 实例(instance)的域#xff0c;调用静态(static)和实例(instance)函数。JNI通过ID识别域和方法#xff0c;一个域或方法的ID是任何处理域和方法的函数的必须…本地代码中使用Java对象通过使用合适的JNI函数你可以创建Java对象get、set 静态(static)和 实例(instance)的域调用静态(static)和实例(instance)函数。JNI通过ID识别域和方法一个域或方法的ID是任何处理域和方法的函数的必须参数。下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数。每个函数接受(作为参数)域或方法的类它们的名称符号和它们对应返回的jfieldID或jmethodID。函数描述GetFieldID得到一个实例的域的IDGetStaticFieldID得到一个静态的域的IDGetMethodID得到一个实例的方法的IDGetStaticMethodID得到一个静态方法的ID构造一个Java对象的实例C代码 jclass cls (*env)-FindClass(env, Lpackagename/classname;); //创建一个class的引用jmethodID id (*env)-GetMethodID(env, cls, , (D)V); //注意这里方法的名称是它表示这是一个构造函数而且构造参数是double型的jobject obj (*env)-NewObjectA(env, cls, id, args); //获得一实例args是构造函数的参数它是一个jvalue*类型。首先是获得一个Java类的class引用 (*env)-FindClass(env, Lpackagename/classname;); 请注意参数Lpackagename/classname;L代表这是在描述一个对象类型packagename/classname是该对象耳朵class路径请注意一定要以分号()结束然后是获取函数的idjmethodID id env-GetMethodID(cls, , (D)V); 第一个是刚刚获得的class引用第二个是方法的名称最后一个就是方法的签名了还是不懂我曾经如此请接着看...难理解的函数签名JNINativeMethod的定义如下typedef struct{const char*name;const char*signature;void*fnPtr;} JNINativeMethod;第一个变量name是Java中函数的名字。第二个变量signature用字符串是描述了函数的参数和返回值第三个变量fnPtr是函数指针指向C函数。其中比较难以理解的是第二个参数例如()V(II)V(Ljava/lang/String;Ljava/lang/String;)V实际上这些字符是与函数的参数类型一一对应的。() 中的字符表示参数后面的则代表返回值。例如()V 就表示void Func();(II)V 表示 void Func(int, int);那其他情况呢请查看下表类型符号booleanZbyteBcharCshortSintIlongLfloatFdoubleDvoidVobject对象LClassName; L类名;Arrays[array-type [数组类型methods方法(argument-types)return-type (参数类型)返回类型稍稍补充一下1、方法参数或者返回值为java中的对象时签名中必须以“L”加上其路径不过此路径必须以“/”分开自定义的对象也使用本规则比如说 java.lang.String为“java/lang/String”com.nedu.jni.helloword.Student为Lcom /nedu/jni/helloword/Student;2、方法参数或者返回值为数组类型时请前加上[例如[I表示 int[],[[[D表示 double[][][]即几维数组就加几个[在本地方法中调用Java对象的方法1、获取你需要访问的Java对象的类jclass cls (*env)-GetObjectClass(env, obj); //使用GetObjectClass方法获取obj对应的jclass。jclass cls (*env)-FindClass(“android/util/log”) //直接搜索类名需要是static修饰的类。2、获取MethodIDjmethodID mid (*env)-GetMethodID(env, cls, callback, (I)V); //GetStaticMethodID(…)获取静态方法的ID使用GetMethdoID方法获取你要使用的方法的MethdoID使用CallVoidMethod方法调用方法。参数的意义env--JNIEnvobj--通过本地方法穿过来的jobjectmid--要调用的MethodID(即第二步获得的MethodID)depth--方法需要的参数(对应方法的需求添加相应的参数)注这里使用的是CallVoidMethod方法调用因为没有返回值如果有返回值的话使用对应的方法在后面会提到。CallVoidMethod CallStaticVoidMethodCallIntMethod CallStaticVoidMethodCallBooleanMethod CallStaticVoidMethodCallByteMethod CallStaticVoidMethod现在稍稍明白文章开始构造Java对象那个实例了吧让我们继续深入一下Jni操作Java的String对象从java程序中传过去的String对象在本地方法中对应的是jstring类型jstring类型和c中的char*不同所以如果你直接当做char*使用的话就会出错。因此在使用之前需要将jstring转换成为c/c中的char*这里使用JNIEnv提供的方法转换。const char *str (*env)-GetStringUTFChars(env, jstr, 0);(*env)-ReleaseStringUTFChars(env, jstr, str);这里使用GetStringUTFChars方法将传进来的prompt(jstring类型)转换成为UTF8的格式就能够在本地方法中使用了。注意在使用完你所转换之后的对象之后需要显示调用ReleaseStringUTFChars方法让JVM释放转换成UTF-8的string的对象的空间如果不显示的调用的话JVM中会一直保存该对象不会被垃圾回收器回收因此就会导致内存溢出。下面是Jni访问String对象的一些方法GetStringUTFChars 将jstring转换成为UTF-8格式的char*GetStringChars 将jstring转换成为Unicode格式的char*ReleaseStringUTFChars 释放指向UTF-8格式的char*的指针ReleaseStringChars 释放指向Unicode格式的char*的指针NewStringUTF 创建一个UTF-8格式的String对象NewString 创建一个Unicode格式的String对象GetStringUTFLength 获取UTF-8格式的char*的长度GetStringLength 获取Unicode格式的char*的长度下面提供两个String对象和char*互转的方法/* c/c string turn to java jstring */jstring charToJstring(JNIEnv* env, const char* pat){jclass strClass (*env)-FindClass(env, java/lang/String);jmethodID ctorID (*env)-GetMethodID(env, strClass, , ([BLjava/lang/String;)V);jbyteArray bytes (*env)-NewByteArray(env, strlen(pat));(*env)-SetByteArrayRegion(env, bytes, 0, strlen(pat), (jbyte*)pat);jstring encoding (*env)-NewStringUTF(env, UTF-8);return (jstring)(*env)-NewObject(env, strClass, ctorID, bytes, encoding);}/* java jstring turn to c/c char* */char* jstringToChar(JNIEnv* env, jstring jstr){char* pStr NULL;jclass jstrObj (*env)-FindClass(env, java/lang/String);jstring encode (*env)-NewStringUTF(env, utf-8);jmethodID methodId (*env)-GetMethodID(env, jstrObj, getBytes, (Ljava/lang/String;)[B);jbyteArray byteArray (jbyteArray)(*env)-CallObjectMethod(env, jstr, methodId, encode);jsize strLen (*env)-GetArrayLength(env, byteArray);jbyte *jBuf (*env)-GetByteArrayElements(env, byteArray, JNI_FALSE);if (jBuf 0){pStr (char*)malloc(strLen 1);if (!pStr){return NULL;}memcpy(pStr, jBuf, strLen);pStr[strLen] 0;}env-ReleaseByteArrayElements(byteArray, jBuf, 0);return pStr;}