使用C++实现JNI接口需要注意的事项
来源:互联网 发布:mac上的解压缩软件 编辑:程序博客网 时间:2024/06/06 06:30
Android NDK带的jni例子都是使用C定义JNI接口,但是在项目中,因为Native代码是用C++编写的,所以我就使用C++定义JNI接口。没有想到,问题来了,现将问题总结如下:
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
}
再次尝试,调用成功!
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-05/36700.htm
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
}
再次尝试,调用成功!
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-05/36700.htm
- 使用C++实现JNI接口需要注意的事项
- 使用C++实现JNI接口需要注意的事项
- 使用C++实现JNI接口需要注意的事项
- 使用C++实现JNI接口需要注意的事项
- 使用C++实现JNI接口需要注意的事项
- 使用UITextView的dataDetectorTypes实现超链接需要注意的事项!
- C编程需要注意的诸多事项
- JNI开发时需要注意的一些事项
- 使用auto_ptr需要注意的事项
- 使用auto_ptr需要注意的事项
- 使用auto_ptr需要注意的事项
- 使用auto_ptr需要注意的事项
- 使用spinlock需要注意的事项
- 使用auto_ptr需要注意的事项
- 使用UNICODE时需要注意的事项
- 使用auto_ptr需要注意的事项 .
- 使用auto_ptr需要注意的事项
- 使用document.write需要注意的事项
- ARM程序优化及其在嵌入式TCP/IP协议实现中的应用
- Java中的instanceof关键字
- ubuntu12.10 建立qt嵌入式开发环境(一)
- 当工程中资源文件很多时,如何快速地定位到资源文件
- OSG学习笔记02:编程时注意版本的区别
- 使用C++实现JNI接口需要注意的事项
- Offcie 安装出现1706的错误
- js--Array.prototype.slice.apply(arguments);
- rspec 测试
- ODS与DW的区别
- 如何由已知频率分频产生任意频率
- C# Webserivce配置注意事项
- 23 种设计模式
- Java 输入输出流教程(一)(原作:Java IO Tutorial by Jakob Jenkov)