1. 程式人生 > >Android下的JNI建立多執行緒的方法

Android下的JNI建立多執行緒的方法

複製程式碼
 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__))
12
13 //執行緒數14 #define NUMTHREADS 5
15
16 //全域性變數17 JavaVM *g_jvm = NULL;
18 jobject g_obj = NULL;
19
20
21 void *thread_fun(void* arg)
22 {
23 JNIEnv *env;
24 jclass cls;
25 jmethodID mid;
26
27 //Attach主執行緒
28 if((*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL) != JNI_OK)
29 {
30 LOGE("%s: AttachCurrentThread() failed", __FUNCTION__);
31 return NULL;
32 }
33 //找到對應的類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 //最後呼叫java中的靜態方法48 (*env)->CallStaticVoidMethod(env, cls, mid ,(int)arg);
49
50
51 error:
52 //Detach主執行緒53 if((*g_jvm)->DetachCurrentThread(g_jvm) != JNI_OK)
54 {
55 LOGE("%s: DetachCurrentThread() failed", __FUNCTION__);
56 }
57
58
59 pthread_exit(0);
60 }
61
62 //由java呼叫以建立子執行緒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 //建立子執行緒70 pthread_create(&pt[i], NULL, &thread_fun, (void *)i);
71 }
72
73
74 //由java呼叫來建立JNI環境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 }
82
83
84 //當動態庫被載入時這個函式被系統呼叫85 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
86 {
87 JNIEnv* env = NULL;
88 jint result = -1;
89
90 //獲取JNI版本91 if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK)
92 {
93 LOGE("GetEnv failed!");
94 return result;
95 }
96
97 return JNI_VERSION_1_4;
98 }
複製程式碼

相關推薦

AndroidJNI建立執行方法

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 #include<pthread.h> 5 6 #include<jni.h> 7 #include<and

VC6.0建立執行方法和注意的事項

#include<stdio.h> #include <process.h> #include <stdio.h> #include <windows.h> DWORD _stdcall ThreadProc(LPVOID l

建立執行的兩種方法

建立執行緒的方法: 一種方法是將類宣告為 Thread 的子類。該子類應重寫 Thread 類的 run 方法。接下來可以分配並啟動該子類的例項。 public class MyThread extends Thread{

Android小知識-Java執行的基礎知識瞭解

本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,包括年底前會更新kotlin由淺入深系列教程,目前計劃在微信公眾號進行首發,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 十月份離職,在家修養一個多月,這一個多月做了很多事,自己的微信公眾號開通了,部落格也換了一種風格,在簡書和掘金分享

執行中的方法、兩種實現方式、匿名內部類建立執行執行安全問題的解決、

多執行緒兩種實現方式: 方式一: 繼承Thread類的方式 方式二: 實現Runnable介面的方式。 方式一: 步驟: // 1. 定義一個類,然後繼承Thread //

解決Android中AsyncTask的執行阻塞問題,android 3.0以後AsyncTask的execute ()方法發生了改變

解決Android中AsyncTask的多執行緒阻塞問題,android 3.0以後AsyncTask的execute()方法發生了改變        前沿:最近工作的時候發現程式中有一個特別嚴重的問題,因為我們app中有一個需求是如果本地沒有快取則請求網路上的資料,如果本

Qt建立執行的兩種方法

1.摘要 Qt有兩種多執行緒的方法,其中一種是繼承QThread的run函式,另外一種是把一個繼承於QObject的類轉移到一個Thread裡。 Qt4.8之前都是使用繼承QThread的run這種方法,但是Qt4.8之後,Qt官方建議使用第二種方法。兩種方法區別不大,用起來都比較方便,但繼

Java建立執行的三種方法

Java多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完後都沒有返回值,只有最後一種是帶返回值的。1、繼承Thread類實現多執行緒

建立執行的幾種方法

多執行緒有幾種實現方法,分別是什麼?(建立執行緒的幾種方式) 多執行緒有三種實現方法: 1、繼承Thread類,重寫run()方法。然後直接new這個物件的例項,建立一個執行緒的例項,再呼叫start()方法啟動執行緒。(其實本質上Thread是實現了Runnabl

建立執行有幾種方法?如何建立執行

多執行緒有幾種實現方法? 多執行緒實現又3種方法,其中前兩中是常用的方法,推薦第二種方法,一個類應該在其修改或者加強是才繼承 1.繼承Thread類,重寫run()方法,例項化該類,呼叫執行緒start()方法 (1)自定義類,繼承Thread類,重寫run()方法 (2

Python併發程式設計之建立執行的幾種方法

今天的內容會比較基礎,主要是為了讓新手也能無障礙地閱讀,所以還是要再鞏固下基礎。學完了基礎,你們也就能很順暢地跟著我的思路理解以後的文章。本文目錄學會使用函式建立多執行緒學會使用類建立多執行緒多執行緒:必學函式講解經過總結,Python建立多執行緒主要有如下兩種方法:函式類接

linuxC語言執行(一)執行建立與取消

#include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void

Java 建立執行

1、繼承java.lang.Thread方式 執行start方法:MyThread的run就會被執行 程式碼片段: import java.util.Scanner; public class Main { public static void main(String[] a

linuxC開發執行程式

轉:https://blog.csdn.net/lingfemg721/article/details/6574804   linux下用C開發多執行緒程式,Linux系統下的多執行緒遵循POSIX執行緒介面,稱為pthread。   #

beginthreadex()函式在建立執行傳入回撥函式時,好像只能傳入全域性函式或類的靜態成員函式,請問能不能傳入類的成員函式呢(非靜態)?

C++類成員函式直接作為執行緒回撥函式2009年06月01日 星期一 17:01我以前寫執行緒時要麼老老實實照著宣告寫,要麼使用C++類的靜態成員函式來作為回撥函式,經常會因為執行緒程式碼而破壞封裝.之前雖然知道類成員函式的展開形式,但從沒想過利用過它,昨天看深入ATL時無意中學

Python建立執行任務並獲取每個執行返回值

轉自:https://www.cnblogs.com/bethansy/p/7965820.html 1.程序和執行緒     (1)程序是一個執行中的程式。每個程序都擁有自己的地址空間、記憶體、資料棧以及其他用於跟蹤執行的輔助資料。程序也可以派生新的程序來執行其他任務,

建立執行的4種方式

1.執行緒是什麼?         執行緒被稱為輕量級程序,是程式執行的最小單位,它是指在程式執行過程中,能夠執行程式碼的一個執行單位。每個程式程式都至少有一個執行緒,也即是程式本身。 2.執行緒狀態         Jav

python執行———2、建立執行的兩種方式

 法一、使用Thread類例項化 法二、繼承Thread來實現多執行緒 #對於io操作來說,多執行緒和多程序效能差別不大 #1、使用Thread類例項化 import time import threading def get_detail_html(url): prin

如何建立執行

方式1:繼承Thread類 步驟: 1):定義一個類A繼承於Java.lang.Thread類. 2):在A類中覆蓋Thread類中的run方法. 3):我們在run方法中編寫需要執行的操作:run方法裡的程式碼,執行緒執行體. 4):在main方法(執行緒)中,建立執行緒物件,並啟動執行緒. (

windowsLibevent的執行封裝(以檔案傳輸為例)

1、主執行緒負責監聽,子執行緒負責響應連線,同時每個子執行緒增加了連結串列來管理連線進來的客戶端,將上一節中的記憶體管理類也封裝進去。總體框架是不變的。 2、封裝類的實現: #pragma once #include "winsock2.h" #include "event2/liste