自動生成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...") ;
}
此上 , 僅供參考學習。