Monthly Archives: 五月 2015

15235313_z0yP

Android JNI开发进阶

JNI调试技巧

写日志

  • 适用场合
    • 多线程环境,单步调试无法工作
    • 循环,查看中间结果
    • 关键点,影响运行结果的地方
  • 调用方式
    #include <android/log.h>
    #define LOG_TAG "System.out”
    
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
    
    LOGI("info\n");
    LOGD("debug\n");
    LOGD(“The string is %s”, p_str);
    

Eclipse IDE调试

Continue reading Android JNI开发进阶

15235313_z0yP

Android JNI开发基础(二)

如何使用JNI

调用Java函数

jclass cls = (*env)->GetObjectClass(env, thiz);
jmethodID methodId = (*env)->GetMethodID(env, cls, "getAout", "()I");
bool use_opensles = (*env)->CallIntMethod(env, thiz, methodId) == AOUT_OPENSLES;
// ...
(*env)->DeleteLocalRef(env, cls);
  • GetObjectClass获取得到调用JNI函数当前对象的类,如果不是当前对象的类,使用FindClass(JNIEnv *env, const char* className)
  • GetMethodID获取调用JNI函数当前对象的类函数,getAout为Java函数名,()I为输入参数和返回值签名,签名的规则见后文
  • CallIntMethod调用Java对象的getAout函数,返回值是int类型,无返回值函数调用CallVoidMethod,其他类型返回值依此类推,静态函数调用CallStaticTypeMethod
  • DeleteLocalRef删除引用,cls使用完后,记得删除引用计数

Continue reading Android JNI开发基础(二)