android jni 編程 三

本次主要講C徽調java方法(靜態調用,動態的還不會,源代碼是動態)

在上一篇的代碼基礎上修改源代碼如下:

jstring Java_com_example_jnitest_JNITest_GetReply (JNIEnv *env, jobject thiz)
 {
         mEnv = env;
         test_jni_c_java();
         return(*env)->NewStringUTF(env,"Hello,JNITest");  
}


JNIEnv* mEnv;   
jclass clazz;   
jmethodID test_javaID = 0;
jmethodID ctor;
jobject obj;

void test_jni_c_java(){
clazz = (*mEnv)->FindClass(mEnv,className);   <span style="font-family:Comic Sans MS;">獲取實例的類定義</span>
ctor = (*mEnv)->GetMethodID(mEnv,clazz,"<init>","()V");  (調用類的構造方法,”<init>“固定寫法)
obj = (*mEnv)->NewObject(mEnv,clazz,ctor);   
test_javaID = (*mEnv)->GetMethodID(mEnv,clazz,"test_java_1","()V");  回調方法
(*mEnv)->CallVoidMethod(mEnv,obj,test_javaID);
}

上面代碼在C文件中,如果是c++文件的話,寫法會有所不同

<pre name="code" class="html">obj = mEnv->NewObject(clazz,ctor);


c文件中添加調試log信息

#include <android/log.h>

在Android.mk中添加 LOCAL_LDLIBS :=-llog

注意android.mak 裏有一行include $(CLEAR_VARS)
必須把LOCAL_LDLIBS :=-llog放在它後面纔有用,否則相當於沒寫

1.#define LOG    "ffmpegDemo-jni" // 這個是自定義的LOG的標識 
2.#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__) // 定義LOGD類型 
3.#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) // 定義LOGI類型 
4.#define LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__) // 定義LOGW類型 
5.#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__) // 定義LOGE類型 
6.#define LOGF(...)  __android_log_print(ANDROID_LOG_FATAL,LOG,__VA_ARGS__) // 定義LOGF類型


注意:

映射方法的時候需要區別靜態和非靜態GetStaticMethodID,GetMethodID  ,參數沒區別。

調用的時候也需要區分CallStaticObjectMethod,CallVoidMethod 而且還需要區分返回值類型

靜態的話參數不用obj,例如:

jstr = (*jniEnv)->CallStaticObjectMethod(jniEnv, TestProvider, getTime);

 


C調用java的類的成員屬性

                                                                                           變量名                                        簽名

jfieldID GetFieldID(jclass clazz, const char*name, const char *sig);
例如

jfieldID mNumFieldID = env->GetFieldID(myCls, “mNumber”, “I”);


jint element = env->GetIntField(myCls, mNumFieldID)

SetFieldID 類似


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章