赞
踩
本次主要讲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);
- }
<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 类似
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。