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

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、

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值