jni 调用c和c++的区别.

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


}


再次尝试,调用成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值