有时候c/c++是面向过程编码,很多有用工具类都没有,要编码人员自己实现,如果可以调用java大量存在的类岂不是更省事更简洁。
下面是通过调用java的Date类产生是时间戳。
public class JniConsTest {
//c访问java构造函数,并返回对象
public native Date getCurrentTime();
public static void main(String[] args) {
// TODO Auto-generated method stub
JniConsTest test=new JniConsTest();
//c/c++层返回的Date 对象
Date date=test.getCurrentTime();
System.out.println("输出时间=="+date.getYear()+"年"+date.getMonth()+"月星期:"+date.getDay());
}
static {
//加载静态库
System.load("D:\\Documents\\Visual Studio 2013"
+ "\\Projects\\JavaConstructor\\x64"
+ "\\Debug\\JavaConstructor.dll");
}
}
java工程目录和c/c++工程目录视图如下:
#include "jni_cons_test_JniConsTest.h"
//c 访问java构造函数 java.util.Date
JNIEXPORT jobject JNICALL Java_jni_1cons_1test_JniConsTest_getCurrentTime
(JNIEnv *Env, jobject jobj){
jclass dateclass=(*Env)->FindClass(Env, "Ljava/util/Date;");
if (dateclass == NULL){
printf("%s\n","get class is NULL");
return NULL;
}
//构造函数的方法名字<init>
jmethodID method_id=(*Env)->GetMethodID(Env,dateclass,"<init>","()V");
jobject date=(*Env)->NewObject(Env, dateclass, method_id);
//调用java/util/Date的getTime方法
jmethodID getTime=(*Env)->GetMethodID(Env, dateclass, "getTime", "()J");
jlong time = (*Env)->CallLongMethod(Env, date, getTime);
//输出时间
printf("time from java:%lld\n",time);
return date;
};
运行效果如下:
总结:易错点是java的构造函数是有名字,而且不是类名,而都是init()