加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

使用C++实现JNI接口需要谨慎的事项

发布时间:2021-11-25 21:42:43 所属栏目:教程 来源:互联网
导读:Android NDK带的jni例子都是使用C定义JNI接口,但是在项目中,因为Native代码是用C++编写的,所以我就使用C++定义JNI接口。没有想到,问题来了,现将问题总结如下: 1、JNIEnv *env参数的使用 所有JNI接口的第一个参数是JNIEnv *env, 在C中,使用方法是 (*env
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
 
}
 
再次尝试,调用成功!

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读