Android Jni踩坑记录

    目前我所知道的jni有两种方式编译,一种是使用ndk-build(也就是要写Android.mk,Application.mk来实现编译so,这也是之前安卓平台一直使用的一种比较老的方式),一种是cmake编译的方式。之前遇到一个莫名崩溃的问题,使用cmake的方式实现的一直没有找到原因来解决,后面直接使用ndk-build的方式就OK了,这里也记录一下,就是遇到莫名其妙的问题的时候,获取换一种编译环境也许能解决问题。

    另外还有一个问题也困扰了我一段时间,就是在jni代码中调用第三方含有c++ stl库的so的问题(比如vector,string等),这里一定要注意的是,你的jni配置的stl库一定要和第三方so配置的是一样的,否则肯定会出现undefined reference to XXX之类的编译问题,因为不同版本的stl的命名空间不一样,直接调用肯定会链接不过去,导致编译出错。你也可以通过ndk的readelf 工具来查看第三方so依赖的是libc++.so还是libstdc++.so等来判断,不过这种方式只能判断个大概,就是说明你是gnustl还是c++_shared等等,并不能说明具体是哪一种,最好的方式是直接问下第三方so的提供者,他是用哪一种stl进行编译的。

   这里引用ndk指南中的原文来说明一下:

  关于jni传递基本类型这种,很简单。也做下记录备忘。

   基本上java层传int,byte,char,short,long,jstring等数据到jni的时候,jni层都会有对应的jint,jbyte,jchar,jshort,jlong,jstring来负责接收这些基本数据类型,同样的jni调用c++文件的时候,又可以直接将这些基本类型转化为c++的基本类型。

   java传递对象,list到jni的时候就需要,jni就需要使用jobject来接收了,收到jobject之后根据java传下来的具体的类来进行解析。

   c++回调java实现:1.首先找到类jclass cls = env->FindClass(g_JavaClassName);  2获取方法id以及返回值类型.jmethodID mid = env->GetMethodID(cls, "function", "(III)V");3.将参数回调回去  env->CallVoidMethod(obj, mid, arg1, arg2);或者回调静态方法CallStaticVoidMethod

    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

景兄弟1366

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值