初学NDK编程,编程中碰到了不少的问题,有点心得,现总结一下:
1. 注意java类在NDK里的表现形式,也就是smali格式。比如Ljava/lang/String; String是大写,后面的分号也不能少。类型一定要匹配,比如调用getClassLoader时,函数的类型是 ()Ljava/lang/ClassLoader; 而不能写成()Ljava/lang/Object; 如果写错,则错误很难马上查到。
2. NDK里对java函数的调用非常严格,静态方法必须使用静态调用接口,返回值为空的则必须使用相应的接口。具体可以参考jni.h.
jobject (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);
jboolean (*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...);
void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...); //注意第二个参数是类
不同的返回值用的接口不一样。
3. 注意区别类的静态方法和普通方法。静态方法是对类而言,而普通方法则是对对象而言。
jobject (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
注意第二个参数是对象。
4. 在进行ndk编程时,其实是在和android虚拟机打交道。它和C++不同的时,错误有时不会马上出现,当logcat里出现某个错误时,有可能是上面的代码出了问题。因此在进行ndk编程时一定要细心和规范。 Ndk编程用到的变量非常多,最好给变量加个前缀,比如 jclass cla_xxx; jstring str_xxx; jmethodID mid_xxxx; 这样就不容易出错。
5. jobject (*NewObject)(JNIEnv*, jclass, jmethodID, ...); 在创建一个新的对象时,注意构造函数名称使用 “<init>”,而不是类名。对于默认的构造则参数为(),自定义构造则按照定义时的参数传递。
6. 虽说java虚拟机有垃圾自动回收机制,但是还是建议在不使用的时候进行适当的释放,以减轻虚拟机的内存压力,特别是一些大的对象。
void (*DeleteLocalRef)(JNIEnv*, jobject);
原文地址:http://blog.csdn.net/chence19871/article/details/41349651