JNI之 c/c++调用java构造函数

有时候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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值