本次主要講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 類似