Android NDK开发(2)----- JNI多线程
2012-03-17 09:47:36 我来说两句
收藏
我要投稿
上一篇:http://www.2cto.com/kf/201203/123039.html
一、概述
JNI编程和Linux上的C/C++编程还是挺相似的,每次java调用JNI中的函数时都会传入有关JVM的一些参数(如JNIEnv,jobject),每次JNI回调java中的方法时都要通过JVM的有关参数来实现,当在JNI中涉及到多线程的话还是有一些不一样的地方,就是要在子线程函数里使用AttachCurrentThread()和
DetachCurrentThread()这两个函数,在这两个函数之间加入回调java方法所需要的代码。
二、要求
掌握JNI多线程编程的方法。
三、实现
新建工程MyThread,修改main.xml文件,在里面只有一个Button,如下: 1
xmlns:android=\3 android:layout_width=\4 android:layout_height=\5 android:orientation=\6
7 8 android:id=\9 android:layout_width=\10 android:layout_height=\11 android:text=\启动JNI线程\12 /> 13 14 修改MyThreadActivity.java文件,实现按钮的监听,在里面调用JNI中的函数来启动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 Activity 10 { 11 private Button mButton = null; 12 13 /** Called when the activity is first created. */ 14 @Override 15 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 //按钮监听 22 mButton.setOnClickListener(new View.OnClickListener() 23 { 24 25 @Override 26 public void onClick(View v) 27 { 28 // TODO Auto-generated method stub 29 //调用JNI中的函数来启动JNI中的线程 30 mainThread(); 31 32 } 33 }); 34 //初始化JNI环境 35 setJNIEnv(); 36 } 37 38 //由JNI中的线程回调 39 private static void fromJNI(int i) 40 { 41 Log.v(\42 } 43 44 //本地方法 45 private native void mainThread(); 46 private native void setJNIEnv(); 47 48 static 49 { 50 //加载动态库 51 System.loadLibrary(\52 } 53 54 } 编写JNI_Thread.c文件,在mainThread()函数里启动5个子线程,在子线程函数里回调java中的静态方法fromJNI()来输出当前子线程是第几个被启动的线程。完整的内容如下: 1 #include 2 #include 3 #include 4 #include 12
8 android:id=\
9 android:layout_width=\10 android:layout_height=\11 android:text=\启动JNI线程\12 /> 13
14
修改MyThreadActivity.java文件,实现按钮的监听,在里面调用JNI中的函数来启动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 Activity 10 {
11 private Button mButton = null; 12
13 /** Called when the activity is first created. */ 14 @Override
15 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 //按钮监听
22 mButton.setOnClickListener(new View.OnClickListener() 23 { 24
25 @Override
26 public void onClick(View v) 27 {
28 // TODO Auto-generated method stub 29 //调用JNI中的函数来启动JNI中的线程 30 mainThread();
31 32 } 33 });
34 //初始化JNI环境 35 setJNIEnv(); 36 } 37
38 //由JNI中的线程回调
39 private static void fromJNI(int i) 40 {
41 Log.v(\42 } 43
44 //本地方法
45 private native void mainThread(); 46 private native void setJNIEnv(); 47 48 static 49 {
50 //加载动态库
51 System.loadLibrary(\52 } 53 54 }
编写JNI_Thread.c文件,在mainThread()函数里启动5个子线程,在子线程函数里回调java中的静态方法fromJNI()来输出当前子线程是第几个被启动的线程。完整的内容如下:
1 #include 2 #include 3 #include 4 #include