当前位置:   article > 正文

android jni 编程 三_jni callstaticobjectmethodv

jni callstaticobjectmethodv

本次主要讲C徽调java方法(静态调用,动态的还不会,源代码是动态)

在上一篇的代码基础上修改源代码如下:

  1. jstring Java_com_example_jnitest_JNITest_GetReply (JNIEnv *env, jobject thiz)
  2. {
  3. mEnv = env;
  4. test_jni_c_java();
  5. return(*env)->NewStringUTF(env,"Hello,JNITest");
  6. }


  1. JNIEnv* mEnv;
  2. jclass clazz;
  3. jmethodID test_javaID = 0;
  4. jmethodID ctor;
  5. jobject obj;
  6. void test_jni_c_java(){
  7. clazz = (*mEnv)->FindClass(mEnv,className); <span style="font-family:Comic Sans MS;">获取实例的类定义</span>
  8. ctor = (*mEnv)->GetMethodID(mEnv,clazz,"<init>","()V"); (调用类的构造方法,”<init>“固定写法)
  9. obj = (*mEnv)->NewObject(mEnv,clazz,ctor);
  10. test_javaID = (*mEnv)->GetMethodID(mEnv,clazz,"test_java_1","()V"); 回调方法
  11. (*mEnv)->CallVoidMethod(mEnv,obj,test_javaID);
  12. }

上面代码在C文件中,如果是c++文件的话,写法会有所不同

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

 


c文件中添加调试log信息

  1. #include <android/log.h>
  2. 在Android.mk中添加 LOCAL_LDLIBS :=-llog
  3. 注意android.mak 里有一行include $(CLEAR_VARS)
  4. 必须把LOCAL_LDLIBS :=-llog放在它后面才有用,否则相当于没写
  5. 1.#define LOG "ffmpegDemo-jni" // 这个是自定义的LOG的标识
  6. 2.#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__) // 定义LOGD类型
  7. 3.#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__) // 定义LOGI类型
  8. 4.#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__) // 定义LOGW类型
  9. 5.#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__) // 定义LOGE类型
  10. 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 类似


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/158484
推荐阅读
相关标签
  

闽ICP备14008679号