JNI之 c/c++呼叫java建構函式
阿新 • • 發佈:2018-11-05
有時候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()