JNI是否要求根据参数类型对参数进行排序?
Does JNI requires ordering of arguments based on argument types
我试图将一些JNI代码集成到我的应用程序中,该应用程序从web服务接收数据并在JNI层中解析它,从那里我尝试通过传递从web服务接收的一些参数来调用Java层中定义的方法。下面是函数和方法的流程:
为jclass和jmethodID定义变量:
static jclass userInfo = NULL ;
static jmethodID create_user_info = NULL ;
Struct定义在c层保存值
struct User_Info {
long userId; // 1
std::string firstName; // 2
std::string lastName; // 3
bool follow; // 4
};
这个函数有问题。此函数在从webservice接收数据、解析数据并创建结构User_Info
后调用。 static jobject createJavaObject(JNIEnv *env, const User_Info& info) {
if(!userInfo){
userInfo = (jclass)env->NewGlobalRef(env->FindClass("com/model/UserInfo"));
assert(userInfo != NULL);
create_user_info = env->GetStaticMethodID(userInfo, "createUserInfo", "("
"I" // userId // 1
"Ljava/lang/String;" // firstName // 2
"Ljava/lang/String;" // lastName // 3
"Z" // follow // 4
")Lcom/model/UserInfo;");
assert(create_user_info != 0);
}
jstring firstName = cast<jstring>(env, info.first_name); // cast function just converts string to jstring
assert(firstName != NULL);
jstring lastName = cast<jstring>(env, info.last_name); // cast function just converts string to jstring
assert(lastName != NULL);
// ISSUE IS WITH FOLLOWING CALL
jobject res = env->CallStaticObjectMethod(userInfo, create_user_info,
info.userId, // 1
firstName, // 2
lastName, // 3
info.follow // 4
);
env->DeleteLocalRef(firstName);
env->DeleteLocalRef(lastName);
return res;
}
// cast function:
jstring cast<jstring, char const *>()(JNIEnv *env, char const *s) {
if (!s) return 0;
jbyteArray bytes = env->NewByteArray(strlen(s));
env->SetByteArrayRegion(bytes, 0, strlen(s), (jbyte*)s);
jmethodID midStringCtor = env->GetMethodID(clsString, "<init>", "([BLjava/lang/String;)V");
jstring ret = (jstring)env->NewObject(clsString, midStringCtor, bytes, encoding);
env->DeleteLocalRef(bytes);
return ret;
}
Java方法:@Native
private static UserInfo createUserInfo(
int userId, // 1
String firstname, // 2
String lastname, // 3
boolean follow // 4
) {
UserInfo info = new UserInfo();
info.userId = userId;
info.firstname = firstname;
info.lastname = lastname;
info.follow = follow;
return info;
}
问题是,当我运行代码,我得到以下错误:
JNI ERROR(应用程序错误):预期的jboolean(0/1),但得到的值为1048605作为参数4到com.model.UserInfo。createUserInfo (int, . lang。字符串,. lang。字符串,布尔)
当我改变java方法和jni函数中的参数顺序并在int 'userId'之后保留布尔'follow'时,则不会发生问题。
我的问题是:JNI是否要求根据参数的类型排序例如,int形参在long/boolean前面,或基本形参在对象前面等。
如果是,是否有任何参考/文档建议,如果没有,那么为什么我的代码在改变参数顺序后工作?
是否需要在JNI函数参数中保持原语和对象的某种顺序
这个问题很难理解。所需要的是保持JNI方法方法声明与在包含本机方法的类上运行javah
所产生的声明一致。
static jclass userInfo = NULL ;
这里有一个bug。保留对jobjects
或jclasses
的静态引用是无效的,除非它们是全局引用或弱引用。
相关文章:
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 是否可以在调用链接器时强制 CMake 重新排序参数?
- C++17.处理使用 auto 相关的模板参数.代码排序困难
- 在C++排序中为比较函数指定参数
- 推力中的参数排序
- C++一个具有 2 个参数(___ _____,整数长度)的函数中的快速排序
- 函数参数:不确定排序还是未排序?
- 用于对可变数量的数组进行排序的可变参数模板
- 提升 MPL 排序模板参数包
- 按参数对向量进行排序
- 五个中三个最大参数的平均值,不使用排序算法或向量/数组
- 根据一个参数对数组进行排序
- 对于列表排序,有没有办法使用相同的参数让多个运算符重载?
- 通过提供指针数组作为参数对数组进行排序
- 使用按插入方式排序的参数创建哈希映射
- C++:如何使用类参数之一对派生自类的对象向量进行排序
- STL 按多个参数C++排序
- 谷歌C++风格指南.为什么要先输入后输出参数排序
- IDL文件和C++头文件中的defaultvalue和retval参数排序
- 基于额外参数排序向量