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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android之jni深入

發布時間:2024/7/23 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之jni深入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

小技巧:自動生成 java本地方法對應的c代碼的方法名 javah 指令 +全類名

java1.6版本 class C:\workspace\HelloWorldFromC2\bin\classes
java1.7以上 src C:\workspace\HelloWorldFromC2\src

獲得方法的簽名的方法

javap -s 打印方法的簽名 注意要cd到 C:\workspace\HelloWorldFromC2\bin\classes 傳全類名

Android.mk文件的書寫

Anroid.mk 文件 LOCAL_PATH := $(call my-dir) // 返回當前c代碼目錄include $(CLEAR_VARS) // 清楚了所有 已local 開頭的配置文件 唯獨不清楚LOCAL_PATHLOCAL_MODULE := hello // 庫函數的名字 嚴格遵守makefile 格式 lib .so 如果前面加lib 不會自動生成了LOCAL_SRC_FILES := Hello.cinclude $(BUILD_SHARED_LIBRARY) // 加入庫函數

java調用C方法,并且傳遞參數

/*** 計算x和y的加法 apktools * 315 * @param x* @param y* @return*/public native int add(int x ,int y); // char String short kiss keep it simple and stupid String[] "123:234" /*** 給字符串后面拼裝字符 加密運算 web url * @param s* @return*/public native String sayHelloInC(String s);// /*** 給c代碼傳遞int數組 讓c代碼給這個數組進行操作* 圖形 聲音的處理* @param iNum* @return*/public native int[] intMethod(int[] iNum);

C代碼輸出到控制臺上LOG

#define LOG_TAG "clog" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

傳遞兩個int實現

JNIEXPORT jint JNICALL Java_com_example_ndkpassdata_DataProvider_add(JNIEnv * env, jobject jobject, jint x, jint y){// 想在logcat控制臺上 打印日志LOGD("x=%d",x);LOGI("y=%d",y);// log.i(TAG,"sss");return x+y;}

字符串拼接實現

JNIEXPORT jstring JNICALL Java_com_example_ndkpassdata_DataProvider_sayHelloInC(JNIEnv * env, jobject jobject, jstring str){char* c="hello";// 在C語言中不能直接操作java中的字符串// 把java中的字符串轉換成c語言中 char數組char* cstr=Jstring2CStr(env,str);strcat(cstr,c);LOGD("%s",cstr);return (*env)->NewStringUTF(env,cstr); }

傳遞數組實現

JNIEXPORT jintArray JNICALL Java_com_example_ndkpassdata_DataProvider_intMethod(JNIEnv * env, jobject jobject, jintArray jarray){// jArray 遍歷數組 jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);// 數組的長度 jsize (*GetArrayLength)(JNIEnv*, jarray);// 對數組中每個元素 +5int length=(*env)->GetArrayLength(env,jarray);int* array=(*env)->GetIntArrayElements(env,jarray,0);int i=0;for(;i<length;i++){*(array+i)+=5;}return jarray; }

C語言利用反射回調java方法

java的反射

Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});declaredMethod.invoke(forName.newInstance(), new Object[]{});

java中的方法的聲明

public class DataProvider {//C調用java空方法public void helloFromJava(){System.out.println("哈哈哈 我被調用了");}//C調用java中的帶兩個int參數的方法public int Add(int x,int y){int result=x+y;System.out.println("result:"+result);return result;}//C調用java中參數為string的方法public void printString(String s){System.out.println(s);}public static void demo(){System.out.println("哈哈哈,我是靜態方法");}public native void callMethod1();public native void callMethod2();public native void callMethod3();public native void callMethod4();public native void callMethod5(); }

實現

實現調用java空方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod1(JNIEnv * env, jobject jobject){/**Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});declaredMethod.invoke(forName.newInstance(), new Object[]{});***////jclass (*FindClass)(JNIEnv*, const char*);jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");// jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);// 方法簽名 參數和返回值jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");// void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);(*env)->CallVoidMethod(env,jobject,methodId); }

實現調用int參數的方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod2(JNIEnv * env, jobject jobject){jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");jmethodID methodId=(*env)->GetMethodID(env,clazz,"Add","(II)I");// jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);(*env)->CallIntMethod(env,jobject,methodId,3,5); }

實現調用String參數的方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod3(JNIEnv * env, jobject jobject){ // 參數 object 就是native方法所在的類jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");jmethodID methodId=(*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");// jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);jstring str=(*env)->NewStringUTF(env,"hello");(*env)->CallVoidMethod(env,jobject,methodId,str);}

實現調用其他類中的方法,注意此時的object為該類的對象

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod4(JNIEnv * env, jobject j){jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/MainActivity");// jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);// 方法簽名 參數和返回值jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");// void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);// 需要創建DataProvider的 對象// jobject (*AllocObject)(JNIEnv*, jclass);jobject obj=(*env)->AllocObject(env,clazz); // new MainActivity();(*env)->CallVoidMethod(env,obj,methodId);}

實現調用靜態方法

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod5(JNIEnv * env, jobject j){jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");// jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);jmethodID methodid=(*env)->GetStaticMethodID(env,clazz,"demo","()V");//void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);(*env)->CallStaticVoidMethod(env,clazz,methodid); }

完成

總結

以上是生活随笔為你收集整理的Android之jni深入的全部內容,希望文章能夠幫你解決所遇到的問題。

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