首页 > 代码库 > NDK编程心得

NDK编程心得

初学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);

NDK编程心得