日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android系统JNI的实现方式

發布時間:2023/12/18 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统JNI的实现方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


Android系統JNI的實現方式

All?rights?reserved

????JNI(Java?Native?Interface)定義了一種Java代碼調用C或者C++代碼等其它代碼的方式。

????Android系統中,JNI通過JNINativeMethod結構體進行描寫敘述,該結構體定義于jni.h,例如以下所看到的:

typedef struct {const char* name;const char* signature;void* fnPtr; } JNINativeMethod;

??? 第一個參數name:是Java代碼中的函數名。

??? 第二個參數signature:用于描寫敘述函數的參數和返回值。

??? 第三個參數fnPtr:C代碼中函數的指針。

??? 當中,第二個參數為一個描寫敘述函數參數和返回值的字符串,字符串的格式例如以下:

??????? (XX..)X

??? X的取值和定義例如以下所看到的:

字符

Java類型

C類型

V

void

void

Z

jboolean

unsigned?char

B

jbyte

signed?char

C

jchar

unsigned?short

S

jshort

short

I

jint

int

J

jlong

long

F

jfloat

float

D

jdouble

double

??? 另外,從jni.h中對于變量類型的定義中也能夠看到這些字符的意義,例如以下所看到的:

typedef unsigned char jboolean; /* unsigned 8 bits */ typedef signed char jbyte; /* signed 8 bits */ typedef unsigned short jchar; /* unsigned 16 bits */ typedef short jshort; /* signed 16 bits */ typedef int jint; /* signed 32 bits */ typedef long long jlong; /* signed 64 bits */ typedef float jfloat; /* 32-bit IEEE 754 */ typedef double jdouble; /* 64-bit IEEE 754 */typedef union jvalue {jboolean z;jbyte b;jchar c;jshort s;jint i;jlong j;jfloat f;jdouble d;jobject l; } jvalue;

??? 比如,為一個驅動加入HAL層,并創建JNI層。僅就JNI層而言,創建frameworks/base/services/jni/com_android_server_DemoService.cpp文件,該文件里用于描寫敘述JNI接口的代碼例如以下所看到的:

static const JNINativeMethod method_table[] = {{"init_native", "()I", (void*)demo_init},{"setVal_native", "(II)V", (void*)demo_setVal},{"getVal_native", "(I)I", (void*)demo_getVal},};

??? 當中“(II)V”,表示函數的有兩個整形參數,返回值為void。

??? 注意:由參數二指定的函數參數和返回值類型一定要和C函數的參數和返回值保持一致,否則盡管編譯可以通過,但在Android系統載入過程中,會報例如以下所看到的的錯誤,導致Android系統無法正常執行。

E/dalvikvm( 1737): ERROR: couldn't find native method E/dalvikvm( 1737): Requested: Lcom/android/server/DemoService;.init_native:()Z E/dalvikvm( 1737): Candidate: Lcom/android/server/DemoService;.init_native:()I E/JNIHelp ( 1737): RegisterNatives failed for 'com/android/server/DemoService', aborting F/libc ( 1737): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1737 (system_server)

??? 以上錯誤通發生在frameworks/base/services/jni/onload.cpp文件里的JNI_OnLoad()函數中,例如以下所看到的:

extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) {JNIEnv* env = NULL;jint result = -1;if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {ALOGE("GetEnv failed!");return result;}ALOG_ASSERT(env, "Could not retrieve the env!");…… <strong>register_android_server_DemoService(env);</strong>……return JNI_VERSION_1_4; }

??? 另外,ProGuard對程序的優化也可能導致上述執行錯誤的發生。此時,能夠在makefile文件里加入“LOCAL_PROGUARD_ENABLED:=disabled宏來關閉ProGuard的優化。????

????關于ProGuard,能夠參考其官方站點:http://proguard.sourceforge.net/

ProGuard是一個免費的Java類文件壓縮器、優化器、混淆器和預校驗器。它會檢測并刪除沒實用到的類、域、方法以及屬性。它最大限度的優化字節碼而且刪除沒用的指令。它用非常短的沒有意義的名字對剩余的類、域和方法進行重命名。最后,它對處理過的代碼進行預校驗。

ProGuard的一些用途例如以下:

A.為了更小的代碼檔案、更快的網絡傳輸、更快的載入速度和更小的內存占用創建更緊湊的代碼;

B.使程序和庫難于進行反向project;

C.列出死代碼,這樣就能將其刪除;

D.為Java?6或更高的版本號對存在的類文件進行重定位和預校驗,以充分利用其高速載入類的性能。




















轉載于:https://www.cnblogs.com/bhlsheji/p/4222224.html

總結

以上是生活随笔為你收集整理的Android系统JNI的实现方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。