1. 程式人生 > >JNI之 c/c++呼叫java建構函式

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()