您可以简化 Java 类和所需的 JNI 代码。
目前,您的本机方法存在一些问题:
public int native getTimeFromC(object time);
- 参数是
Object但应该是jtime。
- 返回值似乎没有目的。
- 既然方法完全初始化了一个
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,您可以看到构造函数的签名。