您的位置:首页 > 移动开发 > Android开发

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

2014-09-11 18:58 459 查看
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类型的指针,用于存储字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息