里面有兩個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#endifJniTest.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方法所屬的對象基本數據
boolean jbooleanbyte jbyte;char jchar;short jshort;int jint;long jlong;float jfloat;double jdouble;void void引用類型(對象)
String jstringobject jobject//數組,基本數據類型的數組byte[] jByteArray//對象數組object[](String[]) jobjectArray1)訪問非靜態屬性
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);
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);}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
得到方法簽名 
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;}新聞熱點
疑難解答