国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android JNI基礎

2019-11-09 17:36:00
字體:
來源:轉載
供稿:網友

0.頭文件的生成及基礎參數詳解

package com.example.jnitest;public class JNITest { public native String getStringFromC(); public native static String getString2FromC();}

里面有兩個native方法 用命令行進入該項目src目錄,使用javah命令javah com.example.jnitest.JNITest 生成頭文件 com_example_jnitest_JNITest.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_jnitest_JNITest */#ifndef _Included_com_example_jnitest_JNITest#define _Included_com_example_jnitest_JNITest#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_jnitest_JNITest * Method: getStringFromC * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_getStringFromC (JNIEnv *, jobject);/* * Class: com_example_jnitest_JNITest * Method: getString2FromC * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_getString2FromC (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif

JniTest.c

JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_getStringFromC (JNIEnv *env, jobject jobj){ //JNIEnv 結構體指針 //env二級指針 //代表Java運行環境,調用Java中的代碼 //簡單的實現 //將C的字符串轉為一個java字符串 return (*env)->NewStringUTF(env,"C String");}JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_getString2FromC (JNIEnv *env, jclass jcls){ return (*env)->NewStringUTF(env,"C String");}//每個native函數,都至少有兩個參數(JNIEnv*,jclass或者jobject)//1)當native方法為靜態方法時://jclass 代表native方法所屬類的class對象(JNITest.class)//2)當native方法為非靜態方法時://jobject 代表native方法所屬的對象

1.類型轉換

基本數據

boolean jbooleanbyte jbyte;char jchar;short jshort;int jint;long jlong;float jfloat;double jdouble;void void

引用類型(對象)

String jstringobject jobject//數組,基本數據類型的數組byte[] jByteArray//對象數組object[](String[]) jobjectArray

2.訪問屬性

1)訪問非靜態屬性

package com.example.jnitest;public class JNITest { public String xm = "xmhaha"; //訪問屬性,返回修改后的屬性 public native String accessField();}JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_accessField (JNIEnv *env, jobject jobj){ //jobj是對象,JNITest.class jclass cls = (*env)->GetObjectClass(env, jobj);

這里寫圖片描述

//jfieldID //屬性名稱,屬性簽名 jfieldID fid = (*env)->GetFieldID(env, cls, "xm", "Ljava/lang/String;"); //xm >> super xm //獲取xm屬性的值 //Get<Type>Field jstring jstr = (*env)->GetObjectField(env, jobj, fid); //jstring -> c字符串 //isCopy 是否復制(true代表賦值,false不復制) char *c_str = (*env)->GetStringUTFChars(env,jstr,JNI_FALSE); //拼接得到新的字符串 char text[20] = "super "; strcat(text,c_str); //c字符串 ->jstring jstring new_jstr = (*env)->NewStringUTF(env, text); //修改xm //Set<Type>Field (*env)->SetObjectField(env, jobj, fid, new_jstr); return new_jstr;}

2)訪問靜態屬性

package com.example.jnitest;public class JNITest { public static int count = 8; //訪問屬性,返回修改后的屬性 public native String accessStaticField();}JNIEXPORT jstring JNICALL Java_com_example_jnitest_JNITest_accessStaticField (JNIEnv *env, jobject jobj){ //jclass jclass cls = (*env)->GetObjectClass(env, jobj); //jfieldID jfieldID fid = (*env)->GetStaticFieldID(env, cls, "count", "I"); //GetStatic<Type>Field jint count = (*env)->GetStaticIntField(env, cls, fid); count++; //修改 //SetStatic<Type>Field (*env)->SetStaticIntField(env,cls,fid,count);}

3.訪問方法

1)訪問非靜態方法

package com.example.jnitest;public class JNITest { public native void accessMethod(); /** * 產生指定范圍的隨機數 * * @param max * @return */ public int genRandomInt(int max) { return new Random().nextInt(max); }}

獲得方法的簽名: 用命令行進入項目的bin/classes目錄,使用javap -s -p 這里寫圖片描述 得到方法簽名 這里寫圖片描述

JNIEXPORT void JNICALL Java_com_example_jnitest_JNITest_accessMethod (JNIEnv *env, jobject jobj){ //jclass jclass cls = (*env)->GetObjectClass(env, jobj); //jmethodID jmethodID mid = (*env)->GetMethodID(env, cls, "genRandomInt", "(I)I"); //調用 //Call<Type>Method jint random = (*env)->CallIntMethod(env, jobj, mid, 200); 2)訪問靜態方法

package com.example.jnitest;public class JNITest { public native void accessStaticMethod(); public static String getUUID() { return UUID.randomUUID().toString(); }}JNIEXPORT void JNICALL Java_com_example_jnitest_JNITest_accessStaticMethod (JNIEnv *env, jobject jobj){ //jclass jclass cls = (*env)->GetObjectClass(env, jobj); //jmethodID jmethodID mid = (*env)->GetStaticMethodID(env, cls, "getUUID", "()Ljava/lang/String;"); //調用 //CallStatic<Type>Method jstring uuid = (*env)->CallStaticObjectMethod(env, cls, mid); //..... }

3)訪問構造方法

//使用java.util.Date產生一個當前時間JNIEXPORT jobject JNICALL Java_com_dongnaoedu_jni_JniTest_accessConstructor(JNIEnv *env, jobject jobj){ jclass cls = (*env)->FindClass(env, "java/util/Date"); //jmethodID(構造方法用<init>) jmethodID constructor_mid = (*env)->GetMethodID(env, cls, "<init>", "()V"); //實例化一個Date jobject date_obj = (*env)->NewObject(env, cls, constructor_mid); //調用getTime方法 jmethodID mid = (*env)->GetMethodID(env, cls, "getTime", "()J"); jlong time = (*env)->CallLongMethod(env, date_obj, mid); return date_obj;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东辽县| 扬中市| 长葛市| 金寨县| 政和县| 巨野县| 布尔津县| 天全县| 黄冈市| 西安市| 潞西市| 灌阳县| 佛学| 岳池县| 莆田市| 寿阳县| 玉田县| 黄陵县| 乌苏市| 五原县| 定州市| 张家港市| 当涂县| 信宜市| 葫芦岛市| 南靖县| 泗洪县| 长宁县| 安西县| 通江县| 稷山县| 扶风县| 石柱| 贵南县| 上饶市| 宝坻区| 临安市| 牟定县| 衡山县| 榕江县| 浦县|