本次主要讲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 类似