JByte

Java 类加载出现死锁? 转

半腔热情 提交于 2020-08-14 18:01:22
出处: Java 类加载还会死锁?这是什么情况? 一、前言 先贴一份测试代码,大家可以先猜测一下,执行结果会是怎样的: import java.util.concurrent.TimeUnit; public class TestClassLoading { public static class A{ static { System.out.println( "class A init" ); try { TimeUnit.SECONDS.sleep( 1 ); } catch (InterruptedException e) { e.printStackTrace(); } new B(); } public static void test() { System.out.println( "aaa" ); } } public static class B{ static { System.out.println( "class B init" ); new A(); } public static void test() { System.out.println( "bbb" ); } } public static void main(String[] args) { new Thread(() -> A.test()).start(); new Thread(() ->

Android JNI 函数注册的两种方式(静态注册/动态注册)

时光总嘲笑我的痴心妄想 提交于 2020-03-07 07:57:49
JNI/NDK 在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相关方法之前, 要对java中native关键字定义的方法进行注册, 注册方式有两种: 静态注册和动态注册, 两者优缺点如下: 静态注册 优点: 理解和使用方式简单, 属于傻瓜式操作, 使用相关工具按流程操作就行, 出错率低 缺点: 当需要更改类名,包名或者方法时, 需要按照之前方法重新生成头文件, 灵活性不高 动态注册 优点: 灵活性高, 更改类名,包名或方法时, 只需对更改模块进行少量修改, 效率高 缺点: 对新手来说稍微有点难理解, 同时会由于搞错签名, 方法, 导致注册失败 静态注册 此注册方法是初学者经常用到的, 比较常见, 这里简单说下流程, 1.编写一个java类,在里面加载对应的so库并且通过native关键字定义需要调用的函数 package com . example . wenzhe . myjni ; /** * Created by wenzhe on 16-1-27. */ public class JniTest { public native int getRandomNum ( ) ; public native String

Android蓝牙开发【七】hfp音频连接

只愿长相守 提交于 2019-12-07 04:08:11
接着上一篇hfp连接继续,查看蓝牙通话时如何进行处理的。hfp连接有两个连接,一个是hfp连接(在设置界面显示的是手机音频),另一个是蓝牙通话时进行的音频连接。这篇说下第二个连接,音频连接处理过程。 该文章是基于Android源码4.3的 1 连接音频 在手机音频正常连接时,接通电话,并选择蓝牙通话。从系统应用Phone开始分析。 代码路径:packages/apps/Phone/src/com/Android/phone/InCallScreen.Java 手机通话可以选择扬声器、听筒、蓝牙,我们选择蓝牙。 public void switchInCallAudio(InCallAudioMode newMode) { switch (newMode) { case SPEAKER: break; //扬声器 case BLUETOOTH: //蓝牙 // 检查hfp是否连接着(蓝牙耳机是否连接可用),检查蓝牙耳机的音频是否连接 if (isBluetoothAvailable() && !isBluetoothAudioConnected()) { if (PhoneUtils.isSpeakerOn(this)) { //关闭扬声器 PhoneUtils.turnOnSpeaker(this, false, true); } connectBluetoothAudio();