jni调用汇总(java传各种类型的数据给c)

来源:互联网 发布:mac常用快捷键一览 编辑:程序博客网 时间:2024/06/06 01:27

1、方法的调用

假设java有这么一个方法

 private static native void openFile();

那么生成相应的jni方法为

void Java_com_churnlabs_ffmpegsample_MainActivity_openFile(JNIEnv * env, jobject this)

问题1:什么是JNIEnv

    找到android-ndk-r7b\platforms\android-8\arch-arm\usr\include下的jni.h文件

    找到JNIEnv  是一个typedef const struct JNINativeInterface* JNIEnv;; 的结构体,接下来调用JNIEnv里面的方法

    jstring     (*NewStringUTF)(JNIEnv*, const char*);

    调用上面的方法:

    return (*(* env)).NewStringUTF(env,"hello world result");

    一般大家不用上面这种方式,而是 (*env)-> NewStringUTF   -> 表示 先获取到 *env 里面的内容(即*(xxx)) 让后点里面的方法。

 

2.c中的string 相连

 //在c语言中 是没有java的String
 char* cstr = Jstring2CStr(env, jstr);
 LOGD("cstr=%s",cstr);
 // c语言中的字符串 都是以'/0' 作为结尾
 char arr[7]= {' ','h','e','l','l','o','\0'};
 strcat(cstr,arr);
 LOGD("new cstr=%s",cstr);
 return (*env)->NewStringUTF(env,cstr);

 

3、java传int 数组给c

JNIEXPORT jintArray JNICALL Java_cn_itcast_ndk3_DataProvider_intMethod
  (JNIEnv * env , jobject obj , jintArray arr){

 //1.知道数组的长度
 //2.操作这个数组里面的每一个元素
 int len = (*env)->GetArrayLength(env,arr);
 LOGD("shuzu len =%d",len);

 jint* intarr = (*env)->GetIntArrayElements(env,arr,1);
 int i =0; //c99
 for(;i<len;i++){
  //*(intarr+i) += 10;
  intarr[i]+= 10;
 }
 return arr;

(*env)->ReleaseIntArrayElements(env,arr,intarr,0); // c语言释放掉 刚才申请的内存空间

4、char 对应c中的string

 

5、静态方法的调用

 public static native int sub(int x ,int y);

JNIEXPORT jint JNICALL Java_cn_itcast_ndk3_DataProvider_sub
  (JNIEnv * env, jclass clazz, jint x, jint y){

 。。。。

}

 

总结:

*env java 虚拟机 结构体c实现的指针 包含的有很多jni方法
 jobject obj 代表的是调用这个c代码的java对象。

 

 

4、