学习jni开发遇到的几个问题

有段时间没进行jni开发了,上次开发的环境更多的是同时帮忙搭建的。这次自己一点点搭建,遇到一些问题。记录下来

一、android project中加入jni目录后一定要convert to c/c++,否则bin下不会生成class文件,也就没法使用别人介绍的javah命令

二、最开始,并没有使用网上介绍的javah方法生成头文件然后按照头文件写cpp文件,而是直接自己加的cpp文件并按照规则封装。之后,编译链接没啥问题,结果run的时候报错“NO JNI_OnLoad found...”,之后去网上找相关问题,结果众说纷纭,后来从stackoverflow中看到说这个错误说的是找不到JNI_ONLOAD函数,但是引起错误的是别的某个原因,也没法确定问题所在。后来按照javah方法生成头文件在写cpp文件这个问题消失。

三、在使用网上介绍的javah方法时,在javah命令一步,刚开始出现“Could not find class file for 'com.example.godlike.MainActivity'.”,分析是没找到java.class文件,结果cd到class文件所在目录下也不好使。

yxh@yxh-youku:~/work/workspace/godlike/bin/classes/com/example/godlike$ ls
BuildConfig.class  MainActivity.class  R.class        R$drawable.class  R$layout.class  R$string.class
jni                R$attr.class        R$dimen.class  R$id.class        R$menu.class    R$style.class
yxh@yxh-youku:~/work/workspace/godlike/bin/classes/com/example/godlike$ javah -jni MainActivity
Error: Could not find class file for 'MainActivity'.
多次实验后发现不能单纯的写MainActivity这个类名,而要写全com.example.godlike.MainActivity,相应的-classpath的目录也要在com之上。

四、解决了三中的小问题后,javah找到class文件后又出现了下属问题:

yxh@yxh-youku:~/work/workspace/godlike/bin/classes$ javah -classpath . com.example.godlike.MainActivity
Error: cannot access android.app.Activity
  class file for android.app.Activity not found

百度之,最后找到的解决办法是:javah命令不能在bin下执行,cd到src目录下后执行javah com.example.godlike.MainActivity成功。

五、这样使用javah方法完成的jni例子也完成了,编译run之后又出现了问题。。。意思是找不到相应的本地方法,jni中的log也没打印出来,看来是本地方法根本就没找到。网上找了半天,没找到所以然,最后看到一个帖子,在此转载过来:

 
java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案

        so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素:

一、Jni方法头部大小写问题     

在C++中,方法名:Java_com_XXX,而不是java_com_XXX。建议直接从生成的.h头文件直接复制方法名到C或者C++文件中。

二、C++文件问题

        如果是C++文件(.cpp或者.cc),要使用extern "C" {   } 把本地方法括进去。

三、往Jni方法中传值问题

         如,调用native方法sendSomeThing(Object object),如果传入的object为null,有可能会报上面错误。

我实验了下,其中的方法二解决了我的问题。


这样jni的例子就运行了起来,达到目标。记录下过程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值