JNI调用错误: No implementation found for native
2016-05-05 13:02
429 查看
JNI 调用时,一直报 No implementation found for native 以及编译时提示找不到undefined refercen
有一个可能是,如果调用的是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
}
再次尝试,调用成功!
单个文件:
g++ file.cpp
这是最简单形式,缺省输出为a.out,可以用-o命令指定输出文件,比如g++ file.cpp f.out
多个文件:
g++ -c 1.cpp -o 1.o
g++ -c 2.cpp -o 2.o
g++ 1.o 2.o -o prog.out
链接成可执行文件:
一般用g++ -o file file.cpp
多个文件是g++ -o file file1.cpp file2.cpp
编译C++不是用GCC而是G++.
如果用GCC能编译但不能链接.
有一个可能是,如果调用的是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
}
再次尝试,调用成功!
单个文件:
g++ file.cpp
这是最简单形式,缺省输出为a.out,可以用-o命令指定输出文件,比如g++ file.cpp f.out
多个文件:
g++ -c 1.cpp -o 1.o
g++ -c 2.cpp -o 2.o
g++ 1.o 2.o -o prog.out
链接成可执行文件:
一般用g++ -o file file.cpp
多个文件是g++ -o file file1.cpp file2.cpp
编译C++不是用GCC而是G++.
如果用GCC能编译但不能链接.
相关文章推荐
- R %operator% 含义
- RANSAC算法详解
- java 消息机制 ActiveMQ
- Linux下日志系统详解
- 【Elasticsearch】Java Client入门
- 第十一周实践项目2————存储班长信息的学生类(Stu数据成员改为私有类型)
- Python学习笔记:列表(list)基本内容
- angularjs中ngModelController学习
- S5P4418开发遇到的问题(持续更新)
- 浅谈利用SQLite存储离散瓦片的思路和实现方法
- textField 的通知和自己的方法的用法(当用作登陆时,想在没有内容的情况下按钮不能点击的实例)
- redis集中监控
- datetime json 序列化时丢掉时区
- 加入域的计算机用户不能使用本地用户远程桌面登录本地计算机解决方法
- 如何正确遍历删除List中的元素,你会吗?
- Android NDK中调用第三方的动态库
- Windows平台下sbt的安装设置
- maven3.0以下引用rt包报错问题解决
- 怎样降低你的焦虑程度
- UiAutomator Android 的自动测试框架(UiAutomator 快速调试)