java ndk 在哪_NDK简介
一、NDK簡介:
C/C++的動態庫。Dalvik通過JNI編程方式調用C/C++代碼。
NDK編程提高軟件性能,加密保護APK文件
ndk-build ?????? NDK編譯生成腳本
Java編譯時會根據java聲明文件生成dex文件,即使沒有java代碼
NDK共享庫:NDK生成的 .so文件(類似dll)
NDK靜態庫:.a文件件
二、JNI中的數據類型:
數據分兩大類:基本類型,引用類型
基本類型
Java類型
JNI類型
C/C++類型
大小
boolean
jboolean
unsigned char
無符號8位
byte
jbyte
char
有符號8位
char
jchar
unsigned short
無符號16位
short
jshort
short
有符號16位
int
jint
Int
有符號32位
long
jlong
long long
有符號64位
float
jfloat
float
32位浮點數
double
jdouble
double
64位浮點數
引用類型
Java類型
原生類型
描述
java.lang.Class
jclass
類類型
java.lang.Throwable
jthrowable
異常類型
java.lang.String
jstring
字符類型
java.lang.Object[]
jobjectArray
任意java對象數組
boolean[]
jbooleanArray
布爾型數組
byte[]
jbyteArray
比特型數組
char[]
jcharArray
字符型數組
short[]
jshortArray
短整型數組
int[]
jintArray
整型數組
long[]
jlongArray
長整型數組
float[]
jfloatArray
浮點型數組
double[]
jdoubleArray
雙浮點型數組
三、JNI中對Java類、域、方法的描述符
1。域描述:基本類型,引用類型,數組類型
基本類型描述符
域描述符
Java語言類型
Z
boolean
B
byte
C
char
S
short
I
int
J
long
F
Float
D
double
引用描述符:L+類描述+;
Eg:String ????????????? Ljava/lang/String;
Object[]?????????? [Ljava/lang/object;
數組域的描述符
Eg:int[]?????????????????? [I
float[]?????????????? [F
String[]???????????? [Ljava/lang/String;
int[][]??????????????? [[I
2。類描述符:類的完整名(包名+類名)“.”替換成“/”
Eg:java.lang.String????? ???????? :java/lang/String
3。方法描述符:
規則:參數的域描述符按照聲明順序放入一個括號中,后跟返回值類型的域描述符。沒有返回值用V(void)表示,如果是類引用后面加“;”
Eg:String text()???????????? ()Ljava/lang/String;
int fun(int i,Object object)???????????? (ILjava/lang/Object;)I
void set(byte[] bytes)????????????????????? ([B)V
Native中字符串的轉換
1。C-〉Java
jstring NewStringUTF(JNIEnv *env, // JNI接口指針
const char* bytes)// C字符串
Eg:jstring jstring1 = env->NewStringUTF(“Hello Wrold”);
2。Java-〉C
char* GetStringUTFChars(JNIEnv *env,????? // JNI接口指針
jstring string,????? // jstring java字符串
jboolean* isCopy) // 表示返回副本還是堆中固定值
Eg:jboolean iscopy;
char* ch = env->GetStringUTFChars(jstring1,&iscopy);
Native中創建數組
1。創建一維數組
// 創建
jintArray NewIntArray(JNIEnv *env,?? // JNI接口指針
jsize length);// 數組長度
// 賦值數組某一范圍
void SetIntArrayRegion(JNIEnv *env,????? //JNI接口指針
jintArray array,? //目的數組
jsize start,????? //基本類型數組開始的位置
jsize len,??????? //數組長度
const jint* buf); //源數組
// 獲取數組值
void GetIntArrayRegion(JNIEnv *env,????? //JNI接口指針
jintArray array,? //目的數組
jsize start,????? //基本類型數組開始的位置
jsize len,??????? //數組長度
const jint* buf); //源數組
// 釋放局部數組對象
void DeleteLocalRef(JNIEnv *env,???????????????? // JNI接口指針
jobject localRef)??? // 要釋放的局部數組對象
用于構建其他基本數據類型的數組
NewArray 方法族
Set< PrimitiveType >ArrayRegion
Get< PrimitiveType >ArrayRegion
2。創建數組對象
// 創建
jobjectArray NewIntArray(JNIEnv *env,????? // JNI接口指針
length,// 數組長度
jcalss elementClass,// 類型
jobject initialElement)// 初始值
// 設置
void SetobjectArrayElement(JNIEnv *env,????? //JNI接口指針
jobjectArray array,? //目的數組
jsize index,????? //目的數組的第幾個索引
jobject value)?????? //寫入的值
Native中java操作java類中的屬性
1。Java層非靜態
獲取java層中屬性ID
jfieldID GetFieldID(JNIEnv *env, // JNI接口指針
jclass class, // Java類對象
const char *name,// 該屬性的name名稱
const char *sig): // 屬性的域簽名
獲取Java層中屬性值
NativeType GetField(JNIEnv *env, // JNI接口指針
jobject obj, // java 對象(不能null)
jfieldID fieldID);// 有效的域ID
設置java層類中屬性的值
void SetField(JNIEnv *env, // JNI接口指針
jobject obj, // java 對象(不能null)
jfieldID fieldID,// 有效的域ID
NativeType value);// 設置新值
2。Java層靜態
獲取java層中屬性ID
jfieldID GetStaticFieldID(JNIEnv *env, // JNI接口指針
jclass class, // Java類對象
const char *name,// 該屬性的name名稱
const char *sig): // 屬性的域簽名
獲取Java層中屬性值
NativeType GetStaticField(JNIEnv *env, // JNI接口指針
jobject obj, // java 對象(不能null)
jfieldID fieldID);// 有效的域ID
設置java層類中屬性的值
void SetStaticField(JNIEnv *env, // JNI接口指針
jobject obj, // java 對象(不能null)
jfieldID fieldID,// 有效的域ID
NativeType value);// 設置新值
Native中操作Java層類或接口的方法
1。Java層靜態方法:
獲取java層中屬性ID
jmethodID GetMethodID(JNIEnv *env, // JNI接口指針
jclass class, // Java類對象
const char *name,// 該屬性的name名稱
const char *sig): // 屬性的域簽名
獲取Java層中屬性值
NativeType CallMOthod(JNIEnv *env, // JNI接口指針
jobject obj, // java 對象(不能null)
jmethodID jmethodID,// 方法ID
...);// 要調用方法的參數
2。Java層靜態方法操作
獲取java層中屬性ID
jmethodID GetStaticMethodID(JNIEnv *env, // JNI接口指針
jclass class, // Java類對象
const char *name,// 該屬性的name名稱
const char *sig): // 屬性的域簽名
獲取Java層中屬性值
NativeType CallStaticMOthod(JNIEnv *env, // JNI接口指針
jobject obj, // java 對象(不能null)
jmethodID jmethodID,// 方法ID
...);// 要調用方法的參數
動態注冊Native方法
1。在Java層聲明要導出的函數
public native String getNatvieString();
2。在native中編寫普通方法
3。定義數組在該數組中將Java中聲明方法和native中定義的方法進行邦定
4。在JNI初始化函數JNI_OnLoad中注冊函數
jint JNI_OnLoad(JavaVM *vm,void* reserved)
{
// 1。獲取env對象
GetEnv或者AttachCurrentThread
// 2。獲取class
FindClass
// 3。注冊
RegisterNatives()
// 4。返回jni版本
return JNI_VERSION_xx;
}
NDK調試器兩款:
1。GDB:UNIX/LINUX下基于命令行的調試工具
2。LLDB:基于LLVM框架。
總結
以上是生活随笔為你收集整理的java ndk 在哪_NDK简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单了解static
- 下一篇: Andorid中的dex文件使用dex2