1. 程式人生 > >自動生成Jni中Java呼叫C語言實現的簽名函式名

自動生成Jni中Java呼叫C語言實現的簽名函式名

首先編寫一個類例如HelloWorld.java類檔案

把你要在Java程式碼中宣告的呼叫C語言的native函式宣告寫在Helloworld.java程式碼中

例如:

public class HelloWorld{

public native String HelloFromC() ;

        public native String hell_from_c() ;

}

然後用javac編譯這個程式碼

javac HelloWorld.java

會生成HelloWorld.class的檔案

然後用javah 編譯class檔案

javah HelloWorld

會生成一個HelloWorld.h的標頭檔案

標頭檔案中就包含了你要呼叫C程式碼的底層實現方法名。

例如

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */


#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    HelloFromc
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_HelloWorld_HelloFromc
  (JNIEnv *, jobject);


/*
 * Class:     HelloWorld
 * Method:    hello_from_c
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_HelloWorld_hello_1from_1c
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

其中 Java_HelloWorld_hello_1from_1c(JNIEnv *, jobject); 就是要定義程式碼要實現的函式簽名

這樣做的好處是防止自己手寫過程中出現不必要的錯誤。。

以上是沒有帶包名的C程式碼的函式簽名 如果要帶包名的函式簽名 就要模擬你Java宣告呼叫C語言java程式碼的目錄結構

例如 java包名是 com.explame.cn 你就要建立這樣的目錄結構

HelloWsorld.java引用包名

import  com.explame.cn;

public class HelloWorld{

public native String HelloFromC() ;

        public native String hell_from_c() ;

}


執行javac命令後 把生成的class檔案放入建立的包目錄下 

然後執行javah 命令來生成C程式碼函式簽名,不過這時你要顯示的指出包名不然會出錯

javah com.explame.cn.HelloWord

執行過後會生成一個com.explame.cn.HelloWord.h的標頭檔案,檔案裡面就會生成C語言的函式簽名的標頭檔案。

然後把生成的標頭檔案放進jni目錄下

這樣你就可以利用C/C++的特性在標頭檔案中宣告函式在.c或.cpp檔案中實現函式

具體如下:

com.explame.cn.HelloWord.h的標頭檔案

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */


#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    HelloFromc
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_HelloFromc
  (JNIEnv *, jobject);   //C程式碼的宣告


/*
 * Class:     HelloWorld
 * Method:    hello_from_c
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_hello_1from_1c
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

com.explame.cn.HelloWord.c的實現

#include <stdio.h>
#include <jni.h>
#include "com.explame.cn.HelloWord.h" //引入標頭檔案

//標頭檔案中宣告的具體實現

JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_HelloFromc

  (JNIEnv *, jobject){

return (*(*env)).NewStringUTF(env,"Hello From C...") ;

}

JNIEXPORT jstring JNICALL Java_com.explame.cn_HelloWorld_hello_1from_1c
  (JNIEnv *, jobject){

return (*(*env)).NewStringUTF(env,"Hello From C...") ;

}

此上 , 僅供參考學習。