在NDK開發(fā)調(diào)用jni函數(shù)時(shí),信息基本都是通過數(shù)據(jù)傳遞來實(shí)現(xiàn)鄙陡。而且jni接口特別高冷冕房,只要稍微
哪里不對,就會崩潰趁矾,把人都要整崩潰耙册。我剛開始就時(shí)不時(shí)因?yàn)橐粋€(gè)字母大小寫錯(cuò)了,少寫一個(gè)分號毫捣,怎么調(diào)都崩潰详拙。所以想要高效開發(fā),熟悉jni的數(shù)據(jù)類型尤為重要蔓同。
Jni常見Api:
JNIEnv:
指JNI的執(zhí)行環(huán)境饶辙,是對Java虛擬環(huán)境的一個(gè)引用。在C中斑粱,我們能夠看到JNIEnv的類型就是JNINativeInterface* 弃揽。而對于C++來說, _JNIEnv是一個(gè)結(jié)構(gòu)體,里面包括了JNINativeInterface*的結(jié)構(gòu)矿微。
能夠看到在它當(dāng)中定義了非常多的函數(shù)指針痕慢,而通過這些定義。JNI層事實(shí)上就獲得了對DVM的引用涌矢,通過定義的這些函數(shù)指針掖举。能夠定位到虛擬機(jī)中的 JNI 函數(shù)表,從而實(shí)現(xiàn)JNI層在DVM中的函數(shù)調(diào)用娜庇。
常用方法:
- FindClass
- GetMethodID
- GetFileID
- NewString
- NewStirngUTF
基本數(shù)據(jù)類型
引用類型
數(shù)組類型
java虛擬機(jī)類型
將JNI注冊到Java時(shí)拇泛,會首先注冊到Java虛擬機(jī)。最好是記住對應(yīng)類型思灌,也可以通過命令行的方式輸出類型。
- 全限定類:
如lang包下的String類型恭取,用 Ljava/lang/String;表示 (對象結(jié)尾加分號)
比如我項(xiàng)目包下有一個(gè)User類泰偿,那么就用 Lcom/example/ndkvaluepass/User;表示。
內(nèi)部類:
該User有個(gè)Address內(nèi)部類蜈垮,那么Address類表示為:Lcom/example/ndkvaluepass/User$Address;
即內(nèi)部類用$符號連接耗跛。
數(shù)組類型:
如[I 表示int類型的數(shù)組
[Lcom/example/ndkvaluepass/User; 表示User數(shù)組方法類型:(J + 第一個(gè)參數(shù)類型簽名 + 第二個(gè)參數(shù)類型簽名 + …)返回類型
1,返回類型為void的:
void setFocusPoint(const float x, const float y); 表示為:(JFF)V
void previewFile(const FileType type, const char* path, const int64_t offsetTime);
表示為: (JILjava/lang/String;J)V
2.返回類型為User數(shù)組的:
vector<User> getUserList();
(J)[Lcom/example/ndkvaluepass/User;
結(jié)構(gòu)體示例:
struct SubtitleInfo {
enum SubtitleType type;
wchar_t* text;
char* fontFile;
int64_t fontColor;
int fontSize;
struct DisplayInfo displayInfo;
int64_t startTimeline;
int64_t endTimeline;
int64_t animationDuration;
enum SubtitleAnimationType animationType;
enum SubtitleAlignType alignType;
bool outlineFlag;
int64_t outlineColor;
int outlineSize;
bool shadowFlag;
int64_t shadowColor;
int shadowSize;
int shadowAngle;
bool scrollFlag;
bool previewFlag;
vector<struct DisplayInfo> displayInfos;
};
struct DisplayInfo {
int64_t time;
float centerX;
float centerY;
float width;
float height;
int rotate;
float alpha;
};
wchar_t,寬字符類型攒发,是C/C++的字符類型调塌,是一種擴(kuò)展的存儲方式,一般為16位或32位惠猿。
int64_t羔砾,64位平臺下int表示
JNINativiMethod示例 :
public native String stringFromJNI();
public native void makeValue(int a,int b);
public static native void createUser(long player, int type, int id, String path, User user)
Java和JNI函數(shù)的綁定表:一定要睜大眼睛看好,一個(gè)字符錯(cuò)了都不行偶妖。
static JNINativeMethod player_methods[] = {
{ "stringFromJni" , "()Ljava/lang/String;" , (void*)stringFromJni },
{ "makeValue" , "(II)V" , (void*)makeValue },
{"createUser", "(JIILjava/lang/String;Lcom/example/ndkvaluepass/User;)V", (void*) createUser},
}
本篇講的是jni數(shù)據(jù)類型姜凄,Jni完全參考手冊。