0

我有一个类似的代码

struct time
{
    long milliscnds;
    int  secs;
}

在我的 java 文件中,我有这样的东西

class jtime
{
    long millscnds;
    int  secs;
}

新 jtime 时间 = 新 jtime();

public int native getTimeFromC(object time);

在本地班

getTimeFromc(JNIEnv* env, jobject thiz,jobject jtime)
 {
   struct time *mytime = getTime(); 

  now to fill the jtime with mytime
 }

请问有什么建议吗?

4

2 回答 2

1

您可以简化 Java 类和所需的 JNI 代码。

目前,您的本机方法存在一些问题:

public int native getTimeFromC(object time);
  1. 参数是Object但应该是jtime
  2. 返回值似乎没有目的。
  3. 既然方法完全初始化了一个jtime对象,为什么不创建并返回一个jtime对象呢?

这个类定义有一个创建对象的工厂方法和一个将一些初始化工作从 JNI 端转移过来的构造函数。

public class jtime {

    long millscnds;
    int  secs;

    public jtime(long millscnds, int secs) {
        this.millscnds = millscnds;
        this.secs = secs;
    }

    public native static jtime FromC();
}

工厂方法可以这样实现:

JNIEXPORT jobject JNICALL Java_jtime_FromC
  (JNIEnv * env, jclass clazz)
{
    struct time *mytime = getTime();

    jmethodID ctor = (*env)->GetMethodID(env, clazz, "<init>", "(JI)V");
    jobject obj = (*env)->NewObject(env, clazz, ctor, mytime->milliscnds, mytime->secs);

    return obj;
}

提示:javap工具类似于javah但显示非本地方法的签名。使用javap -s jtime,您可以看到构造函数的签名。

于 2013-05-02T16:35:16.320 回答
0

类似于以下内容:

void getTimeFromc(JNIEnv* env, jobject thiz, jobject jtime)
{
    struct time *mytime = getTime(); 

    // now to fill the jtime with mytime
    jclass jtimeClazz = (*env)->GetObjectClass(jtime); // Get the class for the jtime object
    // get the field IDs for the two instance fields
    jfieldID millscndsFieldId = (*env)->GetFieldID(jtimeClazz, "milliscnds", "J"); // 'J' is the JNI type signature for long
    jfieldID secsFieldId = (*env)->GetFieldID(jtimeClazz, "secs", "I"); // 'I' is the JNI type signature for int
    // set the fields
    (*env)->SetLongField(jtime, millscndsFieldId, (jlong)mytime.milliscnds);
    (*env)->SetIntField(jtime, secsFieldId, (jint)mytime.secs);
}

理想情况下,您应该缓存 和 的值,millscndsFieldId因为secsFieldId它们在执行期间不会更改(jtimeClazz如果您也可以缓存NewGlobalRef)。

所有 JNI 函数都记录在这里:http ://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

于 2013-05-01T14:32:21.113 回答