android上关于本地C代码到JNI接口的转换问题


大家好,第一次在德问提问,问题有对不住的地方还请多多包含。
是这样的,自己最近在捣腾一个android的音频处理小程序,现在遇到了噪声问题,网上查了查,说google的开源项目webrtc里有噪声抑制的源码,于是想在android上使用现成的代码。
但是现在卡在了噪声抑制源码(C代码)向JNI接口的转换问题上,比如webrtc源码

   
  int WebRtcNs_Create(NsHandle** NS_inst) {
  
*NS_inst = (NsHandle*) malloc(sizeof(NSinst_t));
if (*NS_inst != NULL) {
(*(NSinst_t**)NS_inst)->initFlag = 0;
return 0;
} else {
return -1;
}
}

这个C代码需要一个指向结构体NsHandle指针的指针作为参数进行传递,但是java并不支持指针,今天捣腾了一天也没弄出个所以然来。
所以想请教一下各位大神,我要怎么做才能在android上用上这个WEBRTC的源码呢?
需要我对他的源码进行针对接口的修改么?
如果需要修改,如何改呢?
多谢。

Android jni

小五的小拖鞋 10 years, 8 months ago

问题已经解决,具体详情请参见 Oracle JNI Doc. 第九章。
自己在WebRtc源码外另外写了一个包装函数集,用于在C和java之间传递信息。
具体做法是在本地开辟堆内存,并将该堆的地址通过jint传递回上层java代码保存,以供后续的native code使用,最后将该地址传回free/release之类的C函数以释放本地的对内存。

吃鲸鱼的小虾 answered 10 years, 8 months ago

Your Answer