国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JNI Introduce

2019-11-06 09:41:32
字體:
供稿:網(wǎng)友

References: http://blog.csdn.net/banketree/article/details/40535325 百度百科:http://baike.baidu.com/link?url=G_C-p8YK5fnYffQFRure1sr80yBHmmP5VMMyKbGPzWiGWhKldWXfoLaQKEwJcS-vP_i9dLg79rSrni69wJ_ima 百度文庫:http://wenku.baidu.com/link?url=09Ca0f6iD-jgb4c1m5Uao8bL_z_vYVGs39k7cE5NZwACaVYNpOZJH7NoHloAh0sABFU9j_haF0erMBPKs6VfXQNJ7EI92AETUomwvWvylXK

http://wenku.baidu.com/view/107c3d37b90d6c85ec3ac671.html?re=view

JNI Introduce –>你可以使用JNI來實(shí)現(xiàn)“本地方法”(native methods),并在java程序中調(diào)用它們。 –>JNI支持一個(gè)“調(diào)用接口”(invocation interface),它允許你把一個(gè)JVM嵌入到本地程序中。本地程序可以鏈接一個(gè)實(shí)現(xiàn)了JVM的本地庫,然后使用“調(diào)用接口”執(zhí)行JAVA語言編寫的軟件模塊。JNIEnv && JavaVM –>JavaVM : JavaVM 是 Java虛擬機(jī)在 JNI 層的代表, JNI 全局只有一個(gè) –>JNIEnv : JavaVM 在線程中的代表, 每個(gè)線程都有一個(gè), JNI 中可能有很多個(gè) JNIEnv; 這里寫圖片描述JNI_OnLoad()與JNI_OnUnload() 當(dāng)Android的VM(Virtual Machine)執(zhí)行到System.loadLibrary()函數(shù)時(shí),首先會(huì)去執(zhí)行C組件里的JNI_OnLoad()函數(shù)。它的用途有二: (1)告訴VM此C組件使用那一個(gè)JNI版本。如果你的.so檔沒有提供JNI_OnLoad()函數(shù),VM會(huì)默認(rèn)該.so檔是使用最老的JNI 1.1版本。由于新版的JNI做了許多擴(kuò)充,如果需要使用JNI的新版功能,例如JNI 1.4的java.nio.ByteBuffer,就必須藉由JNI_OnLoad()函數(shù)來告知VM。 (2)由于VM執(zhí)行到System.loadLibrary()函數(shù)時(shí),就會(huì)立即先呼叫JNI_OnLoad(),所以C組件的開發(fā)者可以藉由JNI_OnLoad()來進(jìn)行C組件內(nèi)的初期值之設(shè)定(Initialization) 。JNI 調(diào)用示例: http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.htmlJNI AttacheThread示例: http://www.2cto.com/kf/201203/123575.html 修改MyThreadActivity.java文件,實(shí)現(xiàn)按鈕的監(jiān)聽,在里面調(diào)用JNI中的函數(shù)來啟動(dòng)JNI中的線程,比較簡單,如下: 1 package com.nan.thread; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class MyThreadActivity extends Activity10 {11 PRivate Button mButton = null;12 13 /** Called when the activity is first created. */14 @Override15 public void onCreate(Bundle savedInstanceState)16 {17 super.onCreate(savedInstanceState);18 setContentView(R.layout.main);19 20 mButton = (Button)this.findViewById(R.id.button);21 //按鈕監(jiān)聽22 mButton.setOnClickListener(new View.OnClickListener()23 {24 25 @Override26 public void onClick(View v)27 {28 // TODO Auto-generated method stub29 //調(diào)用JNI中的函數(shù)來啟動(dòng)JNI中的線程30 mainThread();31 32 }33 });34 //初始化JNI環(huán)境35 setJNIEnv();36 }37 38 //由JNI中的線程回調(diào)39 private static void fromJNI(int i)40 {41 Log.v("Java------>", ""+i);42 }43 44 //本地方法45 private native void mainThread();46 private native void setJNIEnv();47 48 static49 {50 //加載動(dòng)態(tài)庫51 System.loadLibrary("JNIThreads");52 }5354 }

編寫JNI_Thread.c文件,在mainThread()函數(shù)里啟動(dòng)5個(gè)子線程,在子線程函數(shù)里回調(diào)java中的靜態(tài)方法fromJNI()來輸出當(dāng)前子線程是第幾個(gè)被啟動(dòng)的線程。完整的內(nèi)容如下:

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 #include<pthread.h> 5 6 #include<jni.h> 7 #include<android/log.h> 8 9 #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))10 #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))11 #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "native-activity", __VA_ARGS__))1213 //線程數(shù)14 #define NUMTHREADS 51516 //全局變量17 JavaVM *g_jvm = NULL;18 jobject g_obj = NULL;192021 void *thread_fun(void* arg)22 {23 JNIEnv *env;24 jclass cls;25 jmethodID mid;2627 //Attach主線程28 if((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK)29 {30 LOGE("%s: AttachCurrentThread() failed", __FUNCTION__);31 return NULL;32 }33 //找到對(duì)應(yīng)的類34 cls = (*env)->GetObjectClass(env,g_obj);35 if(cls == NULL)36 {37 LOGE("FindClass() Error.....");38 goto error;39 }40 //再獲得類中的方法41 mid = (*env)->GetStaticMethodID(env, cls, "fromJNI", "(I)V");42 if (mid == NULL)43 {44 LOGE("GetMethodID() Error.....");45 goto error; 46 }47 //最后調(diào)用java中的靜態(tài)方法48 (*env)->CallStaticVoidMethod(env, cls, mid ,(int)arg);49 5051 error: 52 //Detach主線程53 if((*g_jvm)->DetachCurrentThread(g_jvm) != JNI_OK)54 {55 LOGE("%s: DetachCurrentThread() failed", __FUNCTION__);56 }57 5859 pthread_exit(0);60 }6162 //由java調(diào)用以創(chuàng)建子線程63 JNIEXPORT void Java_com_nan_thread_MyThreadActivity_mainThread( JNIEnv* env, jobject obj)64 {65 int i;66 pthread_t pt[NUMTHREADS];67 68 for (i = 0; i < NUMTHREADS; i++)69 //創(chuàng)建子線程70 pthread_create(&pt[i], NULL, &thread_fun, (void *)i);71 }727374 //由java調(diào)用來建立JNI環(huán)境75 JNIEXPORT void Java_com_nan_thread_MyThreadActivity_setJNIEnv( JNIEnv* env, jobject obj)76 {77 //保存全局JVM以便在子線程中使用78 (*env)->GetJavaVM(env,&g_jvm);79 //不能直接賦值(g_obj = obj)80 g_obj = (*env)->NewGlobalRef(env,obj);81 }828384 //當(dāng)動(dòng)態(tài)庫被加載時(shí)這個(gè)函數(shù)被系統(tǒng)調(diào)用85 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)86 {87 JNIEnv* env = NULL;88 jint result = -1; 8990 //獲取JNI版本91 if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK)92 {93 LOGE("GetEnv failed!");94 return result;95 }9697 return JNI_VERSION_1_4;98 }

Android.mk

1 LOCAL_PATH := $(call my-dir) 2 3 include $(CLEAR_VARS) 4 5 LOCAL_MODULE := JNIThreads 6 LOCAL_SRC_FILES := JNI_Threads.c 7 8 LOCAL_LDLIBS := -llog 910 include $(BUILD_SHARED_LIBRARY)
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 普洱| 玉溪市| 义马市| 都江堰市| 柳江县| 平舆县| 郸城县| 筠连县| 凤阳县| 县级市| 团风县| 得荣县| 石嘴山市| 南通市| 拜泉县| 安阳县| 施秉县| 石门县| 枣庄市| 西丰县| 青铜峡市| 阿鲁科尔沁旗| 南岸区| 德保县| 丹阳市| 玉树县| 阜平县| 普格县| 石首市| 广元市| 昭通市| 灌阳县| 桐城市| 玉屏| 安塞县| 八宿县| 务川| 徐水县| 新乐市| 普陀区| 宝清县|