错误一:

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开发常见错误的更多相关文章

  1. Android NDK开发Crash错误定位[转]

    使用 ndk-stack 的时候需要你的 lib 编译为 debug版的,通常需要下面的修改: 1. 修改 android.mk,增加,为 LOCAL_CFLAGS 增加 -g 选项 2. 修改 ap ...

  2. Android NDK开发Crash错误定位

    在Android开发中,程序Crash分三种情况:未捕获的异常.ANR(Application Not Responding)和闪退(NDK引发错误).其中未捕获的异常根据logcat打印的堆栈信息很 ...

  3. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

  4. Android NDK开发调试

    ndk-stack: https://developer.android.com/ndk/guides/ndk-stack?hl=zh-cn JNI开发: https://developer.andr ...

  5. Android NDK 开发(三)--常见错误锦集合Log的使用【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误, ...

  6. Android NDK开发Hello Word!

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...

  7. Android NDK开发

    Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...

  8. !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结

    http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...

  9. Android NDK开发method GetStringUTFChars’could not be resolved

    Android NDK开发method GetStringUTFChars'could not be resolved 图1 最近用到android的ndk,但在eclipse中提示method Ge ...

随机推荐

  1. mysql source、mysqldump 导入导出数据(转)

    解决了mysql gbk编码的导入导出问题,感谢作者. 一.导入数据 1.确定 数据库默认编码,比如编码 为gbk,将读入途径编码同样设为gbk,命令为:           set names gb ...

  2. 【BZOJ4477】字符串树(可持久化Trie)

    此题花费我整整三天的功夫.还在NoiP贴吧发过贴. 最后发现trie树建新节点时信息未完全复制,真是愚蠢之极. 言归正传. 如果我们已经知道了每个点上的trie树那么询问就是sum[x]+sum[y] ...

  3. [TYVJ1930]编年史

    现在 applepi 手上有一本十分古老的编年史,这本史书记录了很多著名的历史事件.于是applepi 有了一个奇怪的想法……他想知道那些有名的历史事件都是在星期几发生的.现在轮到你了,你要帮助app ...

  4. 浏览器的 16ms 渲染帧

    标签 归档 关于arttle Land 浏览器的 16ms 渲染帧 DOM JavaScript 异步 性能 重绘 由于现在广泛使用的屏幕都有固定的刷新率(比如最新的一般在 60Hz), 在两次硬件刷 ...

  5. AtCoder Regular Contest 090 C D E F

    C - Candies 题意 求左上角走到右下角最大的数字和. 思路 直接\(dp\) Code #include <bits/stdc++.h> #define maxn 110 usi ...

  6. python 生成式和生成器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/10/17 21:46 # @Author : lijunjiang # @Fi ...

  7. 在 IntelliJ IDEA 中配置 JSF 开发环境的入门详解

    JSF 作为 JavaEE 官方标准,在了解并掌握其基本开发技术后,对于功能要求较高.业务流程复杂的各种现代 Web 应用程序开发将会成为非常合适且强大的高效率开发利器.JSF 的开发环境搭建涉及到在 ...

  8. Oracle SQL优化进阶学习

    引言 对于下面的Oracle分页如何优化该段语句: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM task_log order by ...

  9. 使用jquery完成定时弹出广告图片

    <script src="../js/jquery-1.8.3.js"></script> <script type="text/javas ...

  10. ConstraintLayout 约束布局

    约束布局ConstraintLayout 这种布局方式出现已经有一段时间了,刚出现的时候一直以为这种布局只是针对拖拽使用的布局,最近在新项目里看到了这种布局,又重新学习了这种布局,才发现以前真的是图样 ...