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获取的是类引用而非实例引用
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类型的指针,用于存储字符串。