jni 调用c和c++的区别.
来源:互联网 发布:线程池 java 实现 编辑:程序博客网 时间:2024/05/16 18:13
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
}
再次尝试,调用成功!
- jni 调用c和c++的区别.
- jni 调用c和c++的区别.
- jni 调用c和c++的区别.
- JNI调用C和C++的区别
- JNI调用c/c++,env->和(*env)->是有区别的
- JNI调用c/c++,env->和(*env)->是有区别的
- JNI调用c/c++,env->和(*env)->是有区别的
- JNI在C和C++中的调用区别
- Java调用C和C++函数时的JNI使用区别
- Java调用C和C++函数时的JNI使用区别
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- 关于 android 的JNI的java 调用 C和 C 调用JAVA(1)
- 关于 android 的JNI的java 调用 C和 C 调用JAVA(2)
- JNI C/C++和java调用
- C和C++函数时的JNI使用区别
- C库函数和系统调用的区别
- JNI 调用C/C++
- 梵蒂冈豆腐干
- eclipse查看类和方法的引用
- 泳池消毒处理装置:游泳池水处理消毒主要特点与常见问题介绍
- 周末跟朋友一起与客户谈需求有感
- OGNL表达式struts2标签“%,#,$”
- jni 调用c和c++的区别.
- eclipse中 将java项目转换为web项目
- NYOJ86-----------找球号(一)
- 暑期个人赛--第二场--D
- Oracle忘记用户名密码怎么办?
- HDFS集中式缓存管理(Centralized Cache Management)
- Windows7 破解工具 分享一下
- cocoapods自己应用
- cocos2d-x 通过JNI实现c/c++和Android的java层函数互调