Android Jni 创建多线程调用Java方法
来源:互联网 发布:java布尔类型的常量 编辑:程序博客网 时间:2024/06/05 18:21
一 .引入头文件 (注:不用添加 pthread.h 头文件)
二 . 贴上 C++ 代码
特别注意(pthread_create(&pt, NULL, runMethod, (void*)l); 会报红,不必理会
//当动态库被加载时这个函数被系统调用
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
JNIEnv* env = NULL;
jint result = -1;
//获取JNI版本if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) { LOGD("GetEnv failed!"); return result; } return JNI_VERSION_1_4;
}
void* runMethod(void *args);
extern “C”
JNIEXPORT jint JNICALL
Java_opencv_ucsmy_com_jnithreadapplication_MainActivity_nativeThread(JNIEnv *env,
jobject instance) {
//保存全局JVM以便在子线程中使用
env->GetJavaVM(&g_jvm);
//不能直接赋值(g_obj = obj)
g_obj = env->NewGlobalRef(instance);
int l ;pthread_t pt ;//创建子线程//(pthread_t* _Nonnull, pthread_attr_t const*,void* (* _Nonnull start_routine)(void*), void*);pthread_create(&pt, NULL, runMethod, (void*)l);return 1;
}
void* runMethod(void *args) {
JNIEnv *env;jclass cls;jmethodID mid;//Attach主线程if(g_jvm->AttachCurrentThread(&env,args)!= JNI_OK){ LOGD("%s: AttachCurrentThread() failed", __FUNCTION__); return NULL;}//找到对应的类cls = env->GetObjectClass(g_obj);if(cls == NULL){ LOGD("FindClass() Error....."); return NULL;}//(jclass clazz, const char* name, const char* sig)jmethodID toastID = env->GetMethodID(cls,"showToast","()V");env->CallVoidMethod(g_obj,toastID);//Detach主线程if(g_jvm->DetachCurrentThread() != JNI_OK){ LOGD("%s: DetachCurrentThread() failed", __FUNCTION__);}pthread_exit(0);
}
三 ,贴上 Java 代码
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.static { System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Example of a call to a native method TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText("zsdtrhfaedrh"); nativeThread();}/** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */public native int nativeThread();public void showToast(){ final String name = "我来自线程--》"+Thread.currentThread().getName(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show(); } });}
}
- Android Jni 创建多线程调用Java方法
- [JNI] java 多线程调用native 方法
- JNI native多线程调用Java静态方法
- android JNI基本库(jsting转string和C多线程调用java方法的说明)
- android jni 调用java的方法
- Android JNI中C调用Java方法
- Android JNI-c/c++调用java方法
- Android下的JNI创建多线程的方法
- Android下的JNI创建多线程的方法
- Android JNI调用方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- Android Jni多线程调用JNiEnv
- Android JNI开发(2)--native方法调用Java方法
- 使用css美化单选框(radio)和复选框(checkbox)的样式
- Android状态栏的显示与隐藏
- Mycat1.6 release版本报错: can't find (root) parent sharding node for sql
- CookieJar和HTTPCookieProcessor
- 数据库截取字符串的问题
- Android Jni 创建多线程调用Java方法
- 关于java 注解中元注解Inherited的使用详解
- java设计模式--单例模式
- Java类与对象
- 模拟实现strcpy函数
- java基础一
- 2017.11.16心得
- Oracle将时分秒格式的字符串转换为秒进行计算
- day15Set接口