eclipse下的NDK开发,请教

lulu23260 2014-09-01 07:40:43
eclipse生成APK 可以在模拟器上正确运行,

新建Android 应用程序,在lib下建armeabi 并导入 NDK自带的例子helloJNI的.so
在src下建立一Java类,代码:

其中,stringFromJNI 就是helloJNI中的.C文件的函数

修改MainActivity.Java,,onCreate之前
static{
System.loadLibrary("hello-jni");//一定要注意名称没有“lib"
}
之后new一个JNI,调用本地函数,并将返回的字符串 显示在一个textView上,,,结果运行起来模拟器上总是 提示stopped。。

再后来,工程只要这么处理,即使我再删除已做的处理,,要以Android Application运行的时候,就提示有错误,“X”打在工程名处,也不提示什么错,各文件也没有错,

哪里有问题???
ps:大家都怎么做的??

...全文
290 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sodino 2014-10-06
  • 打赏
  • 举报
回复
从ndk / sample/ hello-jni里去看例子吧.. 就不会犯final Jni jni = new Jni()这种错误了
lulu23260 2014-09-03
  • 打赏
  • 举报
回复
引用 11 楼 kifile 的回复:
在Android.mk里改
特别感谢!我再找找问题,争取找到问题结贴。
lulu23260 2014-09-03
  • 打赏
  • 举报
回复
引用 10 楼 kifile 的回复:
把破折号改成下滑呢,可能是不支持破折吧
昨天来了帮助的一个GG,adb 调试发现 提示的错误是什么 .so是无效的 ELF格式的文件,没解决,不明白怎么回事,也搞不了, 偶然从他本子上重新拷了一个 eclipse 和SDK,也把so文件改成了下划线的名字,,OK啦!! 你相信吗?反正是真的!! 自己查找错误,原来的eclipse上即使我把文件名和库名做同样的处理,还是不行,只要有loadLibrary ,程序就stopped! 我表示很不解,原来的eclipse和ADT都是前几天从android.developer上下载的,应该没什么问题的。 找到原因,来此通知。
sagittarius1988 2014-09-02
  • 打赏
  • 举报
回复
在lib下建armeabi 并导入 不应该是在libs目录下么?
  • 打赏
  • 举报
回复
看下problems里有没有显示error的原因,你之前运行stopped的时候看下console有没有什么信息。 楼上说的正确,jni对调用者的包名类名有规定的。
Kifile 2014-09-02
  • 打赏
  • 举报
回复
在Android.mk里改
Kifile 2014-09-02
  • 打赏
  • 举报
回复
把破折号改成下滑呢,可能是不支持破折吧
lulu23260 2014-09-02
  • 打赏
  • 举报
回复
测试发现,即使我不调用那个本地化了的函数,只要有 System.loadLibrary("hello-jni"); 这句,就运行不了!! 郁闷!
lulu23260 2014-09-02
  • 打赏
  • 举报
回复
引用 6 楼 kifile 的回复:
你真确定包名一样,你的实际类是JNI,而你的头文件的方法名中的类名是MainActivity,,,,,,肯定没有办法进行访问啊
哦,好囧!!!改了,还是不行,怎么办,新人学点东西真难!!
凉凉二点凉 2014-09-02
  • 打赏
  • 举报
回复
用静态方法试试,你的jni应该不是这样初始化的
Kifile 2014-09-02
  • 打赏
  • 举报
回复
你真确定包名一样,你的实际类是JNI,而你的头文件的方法名中的类名是MainActivity,,,,,,肯定没有办法进行访问啊
lulu23260 2014-09-02
  • 打赏
  • 举报
回复
引用 3 楼 sagittarius1988 的回复:
在lib下建armeabi 并导入 不应该是在libs目录下么?
在哪儿都不行,why?ps:这么喜感的头像
lulu23260 2014-09-02
  • 打赏
  • 举报
回复
引用 1 楼 kifile 的回复:
首先,android调用ndk时,通过javah生成的h文件对包名,方法名也是有限制的,只有相同包名,方法名的方法才能够调用他。所

引用 2 楼 cclovescw 的回复:
看下problems里有没有显示error的原因,你之前运行stopped的时候看下console有没有什么信息。
楼上说的正确,jni对调用者的包名类名有规定的。


包名一样的呢,详情:

本来文件
在模拟器上可以运行后,

新增jni文件夹,放置helloJNI 例子中的mk文件和C文件,将c文件改为
编译生成.so,libs下的armeabi下出现该文件,
新建Java类,

修改原src下Java文件:


运行APK,模拟器提示stooped,错误信息:


求指导,哪里有问题啊!
Kifile 2014-09-01
  • 打赏
  • 举报
回复
首先,android调用ndk时,通过javah生成的h文件对包名,方法名也是有限制的,只有相同包名,方法名的方法才能够调用他。所以你得将你使用jni的类的包名改成同他的demo的包名,至于出现红叉的原因,现在我也不太清楚,你可以看看你的error列表,或者clean一下呢

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧