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 类似


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值