分享

jni相关

 520jefferson 2016-03-04
eclipse使用jni时出现出现了几个问题,如下,
1、ANDROID_LOG_DEBUG也遇到过,要是添加过头文件,在eclipse的Problems中直接删除错误就可以了。
2、
如果你的库文件由c代码生成的,则在c++代码中链接库中的函数时,也会碰到undefined reference的问题。下面举例说明。

    原因就是main.cpp为c++代码,调用了c语言库的函数,因此链接的时候找不到,解决方法:即在main.cpp中,把与c语言库test.a相关的头文件包含添加一个extern "C"的声明即可。或者c++调用c语音的代码,在c++ 中include c的头文件是,对头文件加上 extern "C"{ #include "c_include.h" }。

3、java 和 c之间数据的传递可以通过byte[] 到jbyteArray 再到jbyte*( 强制转化为char*)的过程完成。process是java给jni数据,getdata是java给jni一个buffer,填满buffer后返回java。

  JNIEXPORT jint  Java_com_samsung_strdemo_Jnivad_process (JNIEnv * env, jobject thiz, jbyteArray pcmBuffer,jint bufsize, jint ns_switch)
{
    jbyte *jbPcm = (jbyte*)env->GetByteArrayElements(pcmBuffer, 0);
    LOGD("ASR:process.");
    return process((char*)jbPcm, bufsize, ns_switch);
}

JNIEXPORT void  Java_com_samsung_strdemo_Jnivad_getdata(JNIEnv * env, jobject thiz, jbyteArray data)
{
   LOGD("ASR:getdata.");
   jbyte *jbdata = (jbyte*)env->GetByteArrayElements(data,0);
   LOGD("ASR:getdata 1.");
   getdata((char*)jbdata);
   LOGD("ASR:getdata 2.");
   env->ReleaseByteArrayElements(data, jbdata, 0);
   LOGD("ASR:getdata over.");
}

4、编译v7a的so文件,可以通过,新建Application.mk文件,写下APP_ABI := armeabi-v7a 。
# The ARMv7 is significanly faster due to the use of the hardware FP
APP_ABI :=  armeabi-v7a
#APP_STL := gnustl_static
#APP_ABI := armeabi x86
#APP_ABI := armeabi armeabi-v7a

5、注意AndroidManifest.xml的权限配置 和 project.properties写到android api的高低。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多