JNI Basic

JNI用法总结
Java侧代码就不要说什么了, 很简单:
1.参数传递
  参数如何从Java代码传递给C代码的,这里仅仅牵涉到几种基本类型:
  jstring, jboolean, jobject,jint,jdouble, 比较简单

2.参数转化
  传递过来j-参数,怎么像使用C代码一样使用?这里就有类型转化的问题。
  a>基本类型可以直接使用, 如double和jdouble可以互用。
  b> java对象使用
     对象有String对象和通用的Object对象。 处理的方式有点不同。
     不要再C/C++中调用Java的方法, C/C++处理完之后, 将数据对象传出就OK
     b1>String对象
        GetStringUTFChars取得从Java传入过来的String对象
        ReleaseStringUTFChars 用完之后需要释放
     b2>Object对象
        先得到对象的类句柄:
        jclass objectClass = (env)->FindClass("com/ostrichmyself/jni/Structure");
        然后取该类中, 需要的域句柄:
        jfieldID str = (env)->GetFieldID(objectClass,"nameString","Ljava/lang/String;");
jfieldID ival = (env)->GetFieldID(objectClass,"number","I");
        传入的jobject对象, 直接对各个域赋值。
        (env)->SetObjectField(theObjet,str,(env)->NewStringUTF("my name is D:"));
(env)->SetShortField(theObjet,ival,10);
        如果没有传入对象,而是新生成对象,则可以通过
        jobject myNewObjet = env->AllocObject(objectClass);

3.Java数组的处理
        用GetObjectArrayElement取传入的数组
        用NewObjectArray 构造一个数组

4.资源释放原则
   a1>C/C++ new的对象或者Malloc的对象,当然要由C/C++去释放
   a2>通过JNIEnv的方法new的对象, 如果不需要给Java使用,则必须释放
   a3>通过GetStringUTFChars转化从Java得到的String对象到UTF,需要开辟内存,使用完Char*时,
      务必释放内存,方法是:ReleaseStringUTFChars


基本涵盖了Java调用C++/C的语法,没有研究C调用Java,是觉得没有必要,c调用Java,说明对Java和C
的优势不清楚。

你可能感兴趣的:(java,C++,c,jni,C#)