Android NDK开发常见错误
错误一:
make: *** No rule to make target `/cygdrive/d/1-workspace/showmap-android-opengles/jni/showmap_opengles_OpenGLESRenderer.c', needed
by `/cygdrive/d/1-workspace/showmap-android-opengles/obj/local/armeabi/objs/OpenGLESMap/showmap_opengles_OpenGLESRenderer.o'. Stop.
该错误是将showmap_opengles_OpenGLESRenderer.c改成showmap_opengles_OpenGLESRenderer.cpp后出现,当然android.mk文件里也作了对应改动
删除 obj 目录,预计是有缓存信息导致去找showmap_opengles_OpenGLESRenderer.c而没找到。
错误二:
JNI:no implementation
found in native...(转载http://laokaddk.blog.51cto.com/368606/1349386)
一 javah引发的问题
BUG:
D/dalvikvm( 1704): Trying to load lib /data/data/com.ulang/lib/libulangaudio.so 0x41052a38
D/dalvikvm( 1704): Shared lib '/data/data/com.ulang/lib/libulangaudio.so' already loaded in same CL 0x41052a38
W/dalvikvm( 1704): No implementation found for native Lcom/ulang/AudioLib;. sayHelloEx ()Ljava/lang/String;
D/AndroidRuntime( 1704): Shutting down VM
W/dalvikvm( 1704): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
E/AndroidRuntime( 1704): FATAL EXCEPTION: main
E/AndroidRuntime( 1704): java.lang.UnsatisfiedLinkError: sayHelloEx
E/AndroidRuntime( 1704): at com.ulang.AudioLib.sayHelloEx(Native Method)
E/AndroidRuntime( 1704): at com.ulang.One.onClick(One.java:76)
E/AndroidRuntime( 1704): at android.view.View.performClick(View.java:3480)
E/AndroidRuntime( 1704): at android.view.View$PerformClick.run(View.java:13983)
E/AndroidRuntime( 1704): at android.os.Handler.handleCallback(Handler.java:605)
E/AndroidRuntime( 1704): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 1704): at android.os.Looper.loop(Looper.java:137)
发现第二个參数 javah生成为 jclass, 因此出错 ,
要将其换成 jobject则能够.
Javah并非全部情况都将第二项生成 jclass, 有时也是生成的jobject.
NE:要特别注意!
#define __cplusplus
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ulang_AudioLib
* Method: sayHelloEx
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ulang_AudioLib_sayHelloEx
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
二
在实验JNI接口调用的时候,发现时而成功,时而运行就异常。在logcat上就有提示:
no implementation found in native ....
后来搜索了一下网络,发现出现这样的情况有可能有几种情况
1.函数名字写错了
2.确认在更改了接口函数的时候。要又一次clean一下project,再rebuild all。
在确认以上两点后。JNI接口调用的no implementation error没有出现了。
(2)执行c++生成的.so库,若报下面错误:(既找不到函数)
No implementation found for native Lcom/dgut/android/MainActivity;.stringFromJNI ()Ljava/lang/String;
java.lang.UnsatisfiedLinkError: stringFromJNI
at com.dgut.android.MainActivity.stringFromJNI(Native Method)
解决方法:
为供Java调用的c++函数前增加extern "C" 修饰。如:(NDK example里面的cpp文件也是这么声明的。參考hello-gl2)
extern "C" {
JNIEXPORT jstring JNICALL Java_com_dgut_android_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz );
} JNIEXPORT jstring JNICALL Java_com_dgut_android_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
{
return env->NewStringUTF("Hello from JNI bear c++");
}
原因是:
被extern "C"修饰的变量和函数是依照C语言方式编译和连接的。
首先看看C++中对类似C的函数是如何编译的:作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。
函数被C++编译后在符号库中的名字与C语言的不同。
比如,如果某个函数的原型为:void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,可是都採用了同样的机制,生成的新名字称为“mangled
name”)。_foo_int_int这种名字包括了函数名、函数參数数量及类型信息,C++就是靠这种机制来实现函数重载的。
比如。在C++中,函数voidfoo( int x, int y )与void foo( int x, float y )编译生成的符号是不同样的,后者为_foo_int_float。
相同地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编敲代码的类成员变量可能与全局变量同名。我们以"."来区分。
而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。
因此,若我们没有使用extern "C"修饰函数,依照C语言方式编译和连接,Jni调用将可能找不到该函数。
错误三:
JNI 调用时,一直报 No implementation found for native
有一个可能是,假设调用的是C++的代码,必须加extern "C"
【转】 jni 调用c和c++的差别.
1、JNIEnv *env參数的使用
全部JNI接口的第一个參数是JNIEnv *env, 在C中。用法是
(*env)->NewStringUTF(env, "Hello from JNI!");
但在C++中,其调用方法是
env->NewStringUTF("Hello from JNI!");
为什么有这样的差别呢,看看jni.h中关于JNIEnv的定义就能够知道了:
#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
#else
typedef const struct JNINativeInterface* JNIEnv;
#endif
能够看到,对于C和C++,定义有所不同,主要原因是C不支持类。所以採用了一种变通的方法。
2、接口找不到
在Java中调用JNI接口时,出现异常。察看日志。发现有例如以下错误:
WARN/dalvikvm(422): No implementation found for native Lcom/whty/wcity/HelixPlayer;.setDllPath (Ljava/lang/String;)V
检查了几遍代码,Cpp中确实定义了这个接口,并且细致对比了Java的包名、类名,确实没有错误,那为什么会出现这样的问题呢。后来突然想到。JNI接口 都是以C的方式定义的。如今使用C++实现,函数定义前是否须要加上extern "C"呢?为此定义了一个头文件。在CPP文件里include该头文件,头文件加上例如以下代码片断:
#ifdef __cplusplus
extern "C" {
#endif
#endif
...
#ifdef __cplusplus
}
再次尝试,调用成功!
Android NDK开发常见错误的更多相关文章
- Android NDK开发Crash错误定位[转]
使用 ndk-stack 的时候需要你的 lib 编译为 debug版的,通常需要下面的修改: 1. 修改 android.mk,增加,为 LOCAL_CFLAGS 增加 -g 选项 2. 修改 ap ...
- Android NDK开发Crash错误定位
在Android开发中,程序Crash分三种情况:未捕获的异常.ANR(Application Not Responding)和闪退(NDK引发错误).其中未捕获的异常根据logcat打印的堆栈信息很 ...
- Android NDK 开发(四)java传递数据到C【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...
- Android NDK开发调试
ndk-stack: https://developer.android.com/ndk/guides/ndk-stack?hl=zh-cn JNI开发: https://developer.andr ...
- Android NDK 开发(三)--常见错误锦集合Log的使用【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511 Android NDK开发经常因某些因素会出现一些意想不到的错误, ...
- Android NDK开发Hello Word!
在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...
- Android NDK开发
Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...
- !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...
- Android NDK开发method GetStringUTFChars’could not be resolved
Android NDK开发method GetStringUTFChars'could not be resolved 图1 最近用到android的ndk,但在eclipse中提示method Ge ...
随机推荐
- mysql source、mysqldump 导入导出数据(转)
解决了mysql gbk编码的导入导出问题,感谢作者. 一.导入数据 1.确定 数据库默认编码,比如编码 为gbk,将读入途径编码同样设为gbk,命令为: set names gb ...
- 【BZOJ4477】字符串树(可持久化Trie)
此题花费我整整三天的功夫.还在NoiP贴吧发过贴. 最后发现trie树建新节点时信息未完全复制,真是愚蠢之极. 言归正传. 如果我们已经知道了每个点上的trie树那么询问就是sum[x]+sum[y] ...
- [TYVJ1930]编年史
现在 applepi 手上有一本十分古老的编年史,这本史书记录了很多著名的历史事件.于是applepi 有了一个奇怪的想法……他想知道那些有名的历史事件都是在星期几发生的.现在轮到你了,你要帮助app ...
- 浏览器的 16ms 渲染帧
标签 归档 关于arttle Land 浏览器的 16ms 渲染帧 DOM JavaScript 异步 性能 重绘 由于现在广泛使用的屏幕都有固定的刷新率(比如最新的一般在 60Hz), 在两次硬件刷 ...
- AtCoder Regular Contest 090 C D E F
C - Candies 题意 求左上角走到右下角最大的数字和. 思路 直接\(dp\) Code #include <bits/stdc++.h> #define maxn 110 usi ...
- python 生成式和生成器
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/10/17 21:46 # @Author : lijunjiang # @Fi ...
- 在 IntelliJ IDEA 中配置 JSF 开发环境的入门详解
JSF 作为 JavaEE 官方标准,在了解并掌握其基本开发技术后,对于功能要求较高.业务流程复杂的各种现代 Web 应用程序开发将会成为非常合适且强大的高效率开发利器.JSF 的开发环境搭建涉及到在 ...
- Oracle SQL优化进阶学习
引言 对于下面的Oracle分页如何优化该段语句: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM task_log order by ...
- 使用jquery完成定时弹出广告图片
<script src="../js/jquery-1.8.3.js"></script> <script type="text/javas ...
- ConstraintLayout 约束布局
约束布局ConstraintLayout 这种布局方式出现已经有一段时间了,刚出现的时候一直以为这种布局只是针对拖拽使用的布局,最近在新项目里看到了这种布局,又重新学习了这种布局,才发现以前真的是图样 ...