使用JNI创建,填充和返回Java类实例
问题内容:
我正在尝试使用JNI函数创建Java类,并使用DeviceId.java构造函数方法设置该类的某些属性。我可以使用GetMethodID获取构造函数方法,但是如何创建Device.java的新实例,然后设置属性(setId和setCache)。目标是将完全填充的Device.java对象的实例返回给调用者。有任何想法吗?
JNI功能:
JNIEXPORT jobject JNICALL Java_com_test_getID(JNIEnv *env, jclass cls)
{
jmethodID cnstrctr;
jclass c = (*env)->FindClass(env, "com/test/DeviceId");
if (c == 0) {
printf("Find Class Failed.\n");
}else{
printf("Found class.\n");
}
cnstrctr = (*env)->GetMethodID(env, c, "<init>", "(Ljava/lang/String;[B)V");
if (cnstrctr == 0) {
printf("Find method Failed.\n");
}else {
printf("Found method.\n");
}
return (*env)->NewObject(env, c, cnstrctr);
}
Java类:
package com.test;
public class DeviceId {
private String id;
private byte[] cache;
public DeviceId(){}
public DeviceId(String id, byte[] cache){
this.id=id;
this.cache=cache;
}
public byte[] getCache() {
return cache;
}
public void setCache(byte[] cache) {
this.cache = cache;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
问题答案:
调用时GetMethodID
,您为two-arg构造函数提供了签名。因此,您只需要在呼叫时传递jstring
和即可-
例如:jbytearray``NewObject
return (*env)->NewObject(env, c, cnstrctr, id, cache);
除非您决定调用0-arg构造函数,否则无需调用setId
and
setCache
方法,这只会使您的代码复杂化,因为您必须GetMethodID
调用它们并调用它们。沿您的路线继续前进更简单。