android NDK 使用JNI实现与原生代码通信

1、关于原生代码的声明
/*静态native方法声明*/
public static native String stringFromJni();
/*native方法声明*/
public native String stringFromJni();

2、原生方法实现
这两种方式在实现上会有略微不同
用javah的命令行工具生成的头文件,分别为
jString Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz );
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jclass clazz );


其中,JNIEnv是指向JNI函数表的接口指针,jobject是包含native方法的类实例的对象引用。由于静态方法没办法与实例绑定,所以jclass获取的是类引用而非实例引用

原生代码通过JNIEnv接口指针提供的各种函数来使用虚拟机的功能,JNIEnv是一个指向线程-局部数据的指针,而线程-局部数据中包含指向函数表的指针。

这里我们需要注意的是,传递给每一个原生方法调用的JNIEnv接口指针在与方法调用相关的线程中也有效,但是它不能被缓存,也不能被其他线程使用。

3、JNIEnv中经常用到的方法如下:

    mStore *store = new mStore();
    jobject ptr = env->NewDirectByteBuffer(store, 0);
    mStore *store = (mStore *) env->GetDirectBufferAddress(ptr);

        将C++ 中的某个对象转化成jobject对象进行存储,可传递到java端进行序列化存储,下次不需要再次创建,native方法需要使用ByteBuffer方式进行序列化,切记

        public nativeByteBuffer open(String name, String path, long size, int type,boolean compressMode);

---------------------------------------------------------------------------------------------------------------------------------------------------

const char *nameStr = env->GetStringUTFChars(name,0);

         env->ReleaseStringUTFChars(name,nameStr);

         将native中的jstring转成  char*   用于进行C 与java的字符串转换,下面方法切记使用,要释放申请的内存空间,否则容易导致内存泄露。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------


       jbyteArray array = env->NewByteArray(size);

       env->SetByteArrayRegion(array,0,size,body);


jclass stringClass = env->FindClass("java/lang/String");

jobjectArray array = env->NewObjectArray(size,stringClass,NULL);

jstring tempFirst = env->NewStringUTF(store->getFirstKey());


env->DeleteLocalRef(stringClass);

env->DeleteLocalRef(tempFirst);


 以上为创建各种Array类型,比较常用的jobjectArray可以通过env调用java层的类进行直接操作,最后要记得删除掉相关的引用,防止产生内存泄露


------------------------------------------------------------------------------------------------------------------------------------


void * keyPtr = env->GetByteArrayElements(key, 0);

env->ReleaseByteArrayElements(key,(jbyte *) keyPtr,0);

将native的jbyteArray转成C中的Byte类型的指针,用于存储字符串。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章