Category Archives: Android开发

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开发基础(二)

ysrb

如何反编译、修改、重新打包APK

Java语言特性注定了轻松被爆菊的命运,虽然有代码混淆,反编译后的代码还是具备一定的可读性,为反编译、修改代码提供了便利,下面祭出完爆APK的几大神器:

  1. Apktool,将APK里的资源和代码解压出来,将Binary XML还原成可读XML文件,class反编译成smali,连9.png也能还原;
  2. dex2jar,smali代码一样很难看懂,此神器将APK里的dex还原成jar,便于用JD GUI查看,如果你能牛到直接看懂smali代码,请忽略;
  3. JD GUI,反编译class的神器,也支持jar,没有混淆的代码几乎能直接编译,混淆后的代码,慢慢看也能看懂,用于找要修改的地方;
  4. Eclipse + ADT,这个就不介绍了,当然Android Studio也可以;
  5. APK签名工具,签名后的APK才能安装到Android系统。

Continue reading 如何反编译、修改、重新打包APK