JNI关于No implementation found for java.lang.String

在这儿纯粹是为了积累自己犯过的错误并进行纠正和记录:


我昨天将JNI项目中的.c后缀改成了.cpp(将C换成C++),出现多个错误,于是做了如下修改:

1.首先,原本的字符串转换方法中(*env)->报错了,故应明确c和c++的区别:

JNI接口的JNI环境指针JNIEnv *env, 在C中,使用方法是(*env)->NewStringUTF(env, "args in jni");
而在C++中,则是env->NewStringUTF("args in jni");
从jni.h中关于JNIEnv的定义去看:
#if defined(__cplusplus)   //即C++,哈哈^_^
typedef _JNIEnv JNIEnv;
#else
typedef const struct JNINativeInterface* JNIEnv;
#endif
从C和C++的该定义可知,主要原因是C不支持类。

因此将(*env)->改成了(env)->


2.出现No implementation found for java.lang.String

经过反复确认包名及相关的关键字符无误后,还发现两个问题:

a.在java中的接口文件的本地方法名中,我使用了“set_v()”,因此利用javah命令编译的文件中出现"set_1v",原因是在JNI的语法中,

   "_"是连接包名和方法等的具有特殊含义的连接符,因此不能滥用,于是在JAVA代码中对方法名进行修改

b.经过步骤a.之后,发现该问题仍然没有得到解决,后来发现JNI接口都是以C语言的方式定义的,而我将C换成C++去实现,因此函数定义前&后需要加上以下代码:

#ifndef _Included_cutils_CUtilTestVar
#define _Included_cutils_CUtilTestVar
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     cutils_CUtilTestVar
 * Method:    createVar
 * Signature: ()V
 */
JNIEXPORT jint JNICALL Java_cutils_CUtilTestVar_createV
  (JNIEnv *, jobject);



#ifdef __cplusplus
}
#endif
#endif

c.再次运行,发现问题已解决


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值