首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

06.Eclipse下Ndk开发(使用fmod播放声音)

(创建于2017/12/26) 1.搜索fmod,并下载代码 5199906.png 2.拿到Android相关的代码后,打开目录结构 5291234.png 5307203.png 我们首先使用lowlevel中的代码先将程序运行起来,后续实现变声功能 3.创建eclipse中的安卓项目,将jar包fmod.jar拷贝到libs文件夹下并添加到build path 4.创建jni目录(eclipse项目根目录),将下载代码中的so库拷贝到jni目录,以armeabi中的一个为例,然后将inc中的头文件全部拷贝到jni目录下, 本次只实现播放声音,所以我们拷贝example中的play_sound.cpp文件到jni目录下,此时目录结构为: 5667781.png 5.点击进入play_sound.cpp,看到两个头文件: 5845234.png fmod在inc目录下,需要加上路径,common.h还没有引入,所以我们拷贝common.h到jni目录下 5967734.png jni目录: 5986921.png 6.点击进入common.h中,发现它还引用了common_platform.h 头文件,所以拷贝common_platform到jni目录下,(拷贝头文件的时候,将相应的cpp文件也拷贝进来,常识),修改不正确的头文件路径,每个新引入的头文件或者源文件,都要首先检查它引入的其他的头文件或源文件的引入路径是否正确,不正确的做修改 7.将example中的MainActivity拷贝到我们项目中并覆盖,修改类中报错的地方,发现一段关键代码: org.fmod.FMOD.init(this); 可以猜想,这段代码就是jar包中的,解压查看可以证实 往下可以看到加载动态库的代码: static { /* * To simplify our examples we try to load all possible FMOD * libraries, the Android.mk will copy in the correct ones * for each example. For real products you would just load * 'fmod' and if you use the FMOD Studio tool you would also * load 'fmodstudio'. */ // Try debug libraries... try { System.loadLibrary("fmodD"); System.loadLibrary("fmodstudioD"); } catch (UnsatisfiedLinkError e) { } // Try logging libraries... try { System.loadLibrary("fmodL"); System.loadLibrary("fmodstudioL"); } catch (UnsatisfiedLinkError e) { } // Try release libraries... try { System.loadLibrary("fmod"); System.loadLibrary("fmodstudio"); } catch (UnsatisfiedLinkError e) { } System.loadLibrary("stlport_shared"); System.loadLibrary("example"); } 目前我们就只是引入了libfmod.so和libfmodL.so,所以,多余的可以去掉,得到结果: static { /* * To simplify our examples we try to load all possible FMOD * libraries, the Android.mk will copy in the correct ones * for each example. For real products you would just load * 'fmod' and if you use the FMOD Studio tool you would also * load 'fmodstudio'. */ try { System.loadLibrary("fmodL"); } catch (UnsatisfiedLinkError e) { } try { System.loadLibrary("fmod"); } catch (UnsatisfiedLinkError e) { } //我们自己的添加本地支持时生成的so名字 System.loadLibrary("qq_voice"); } 再往下可以看到一系列的native方法,有native方法,就必然有cpp文件中有对应的jni方法,所以我们需要将包名改成正确的,这里 简单粗暴一点,直接将项目包名改成jni方法中的包名,这样就不必修改cpp和头文件中的代码了 private native String getButtonLabel(int index); private native void buttonDown(int index); private native void buttonUp(int index); private native void setStateCreate(); private native void setStateStart(); private native void setStateStop(); private native void setStateDestroy(); private native void main(); 对应的jni方法位于common_platform.cpp中: jstring Java_org_fmod_example_MainActivity_getButtonLabel(JNIEnv *env, jobject thiz, jint index) { return env->NewStringUTF(Common_BtnStr((Common_Button)index)); } void Java_org_fmod_example_MainActivity_buttonDown(JNIEnv *env, jobject thiz, jint index) { gDownButtons |= (1 << index); } void Java_org_fmod_example_MainActivity_buttonUp(JNIEnv *env, jobject thiz, jint index) { gDownButtons &= ~(1 << index); } void Java_org_fmod_example_MainActivity_setStateCreate(JNIEnv *env, jobject thiz) { } void Java_org_fmod_example_MainActivity_setStateStart(JNIEnv *env, jobject thiz) { gSuspendState = false; } void Java_org_fmod_example_MainActivity_setStateStop(JNIEnv *env, jobject thiz) { gSuspendState = true; } void Java_org_fmod_example_MainActivity_setStateDestroy(JNIEnv *env, jobject thiz) { gQuitState = true; } void Java_org_fmod_example_MainActivity_main(JNIEnv *env, jobject thiz) { gJNIEnv = env; gMainActivityObject = thiz; FMOD_Main(); } 7.文件拷贝差不多了,我们就添加native支持,右键->Android tools ->add native support,设置so文件名,打开Android.mk文件: 7252328.png 我们需要将LOCAL_SRC_FILES := qq_voice2.cpp 改成 LOCAL_SRC_FILES :=play_sound.cpp build project一下,发现报错,从第一个错误开始 jni/play_sound.cpp:23: error: undefined reference to 'Common_Init(void**)' Common_Init 是common_platform.cpp中的方法,但是却提示找不到,是因为我们的Android.mk文件中没有配置编译,它需要和 play_sound.cpp一同编译才行,因为play_sound依赖common_platform 修改之前: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := qq_voice2 LOCAL_SRC_FILES := play_sound.cpp include $(BUILD_SHARED_LIBRARY) 修改添加之后: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := qq_voice2 LOCAL_SRC_FILES := play_sound.cpp common_platform.cpp include $(BUILD_SHARED_LIBRARY) build一下,common_platform.cpp仍然报错,是因为这两个 8048718.png 说明它使用了STL,标准模板库 需要在Application.mk中设置支持 ##支持C++异常处理,标准莫板块 APP_STL := gnustl_static build之后,不在爆红 然后解决这个问题 jni/play_sound.cpp:29: error: undefined reference to 'ERRCHECK_fn(FMOD_RESULT, char const*, int)' 异常处理,需要引入[common.cpp](file://C:\gaoyuan\code\workspace-android\qq_voice2\jni\common.cpp) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := qq_voice2 LOCAL_SRC_FILES := play_sound.cpp common_platform.cpp common.cpp include $(BUILD_SHARED_LIBRARY) 在Android.mk中添加预编译的两个so文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := fmod LOCAL_SRC_FILES := libfmod.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := fmodL LOCAL_SRC_FILES := libfmodL.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := qq_voice2 LOCAL_SRC_FILES := play_sound.cpp common_platform.cpp common.cpp LOCAL_SHARED_LIBRARIES := fmod fmodL include $(BUILD_SHARED_LIBRARY) 在build,编译已经成功了,但是运行崩溃,是因为需要的音频文件没有导入,可以看play_sound中 8567015.png 这三个文件需要导入,点击Common_MediaPath可以看到这些文件放入assets目录下即可 8624484.png 我们在下载的代码中的media文件夹下找到这三个并拷贝进来,运行发现报错,原来是加载动态库的时候, //我添加本地支持时生成的so名字 System.loadLibrary("qq_voice");这样写的,而实际上生成的so是qq_void2所以导致加载不到,修改即可 System.loadLibrary("qq_voice2") 到此,已经可以运行成功并且播放声音了

优秀的个人博客,低调大师

Mac下使用Sublime Text3 搭建Java开发环境

在学习Java的道路上,有很多流行的IDE,IDEA,Eclipse…很多优秀的环境,但是插件太多,加载太慢,不太适合我这种轻量的编程学习者,今天安利一款软件,(Sublime Text3),一个贼好用的文本编辑器,也是被别人安利的,下面说一下怎么配置java的环境。 下载软件都是傻瓜式的,直接dmg挂载就可以了。 打开软件,写好一个类名,然后command+s;它会让你保存文件,在save as这儿再加文件类型,这样做的好处是在文本编辑器中不用回删.java的后缀,直接写class就可以,很方便,如图。 save(保存)where(你保存的路径)2.点击你的标题栏 Tools—Build System—New Build System 注意在这儿Java文件在编译的时候会产生一个.class文件,它只会编译还没有去运行,如果要让文件编译还要运行,改一下这个写入文件就行了。 配置文件怎么写?粘贴过去就可以了 ` **{"shell_cmd": "javac -encoding utf-8 $file_name && java $file_base_name", "file_regex": "^ \javac\:([0-9]+):() (.)$", "selector": "source.java", "encoding": "utf-8"}** 这里我说个事情,我是不喜欢很多class文件跟java文件混在一起的,你可以通过一些命令只让Java文件留在你的文件夹里。 "shell_cmd": "javac -encoding utf-8 $file_name && java $file_base_name && rm -rf $file_base_name.class”,用这一行把上面的第一行替换了就行了。保存就可以了。 3.选择Build System,在run上面打勾就可以了。

优秀的个人博客,低调大师

iOS 开发之指定 UIView 的某几个角为圆角

如果需要将 UIView 的 4 个角全部都为圆角,做法相当简单,只需设置其 Layer的 cornerRadius 属性即可(项目需要使用QuartzCore框架)。而若要指定某几个角(小于4)为圆角而别的不变时,这种方法就不好用了。 对于这种情况,Stackoverflow 上提供了几种解决方案。其中最简单优雅的方案,就是使用 UIBezierPath。下面给出一段示例代码。 UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120, 10, 80, 80)]; view2.backgroundColor = [UIColor redColor]; [self.view addSubview:view2]; UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view2.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)]; CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; maskLayer.frame = view2.bounds; maskLayer.path = maskPath.CGPath; view2.layer.mask = maskLayer; 其中, byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight 指定了需要成为圆角的角。该参数是 UIRectCorner 类型的,可选的值有: * UIRectCornerTopLeft * UIRectCornerTopRight * UIRectCornerBottomLeft * UIRectCornerBottomRight * UIRectCornerAllCorners 从名字很容易看出来代表的意思,使用“ | ”来组合就好了。

优秀的个人博客,低调大师

Android开发应用实例:计算标准体重的实例(简单版)

下面是一个简单的计算标准体重的实例,选择自己的性别,再输入自己的身高,点击Button就能在Toast显示自己的标准体重,看看自己的体重有没有符合标准哦。 计算标准体重的方法: 男性:(身高cm-80)×70﹪=标准体重 女性:(身高cm-70)×60﹪=标准体重 BMIActivity.java packagecom.lingdududu.bmi; importjava.text.DecimalFormat; importjava.text.NumberFormat; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.RadioButton; importandroid.widget.Toast; /* *@authorlingdududu*该程序的功能是用户选择自己的性别和输入自己的身高,然后点击按钮,就能在Toast显示出自己的标准体重 */ publicclassBMIActivityextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ privateButtoncountButton; privateEditTextheighText; privateRadioButtonmaleBtn,femaleBtn; Stringsex=""; doubleheight; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //调用创建视图的函数 creadView(); //调用性别选择的函数 sexChoose(); //调用Button注册监听器的函数 setListener(); } //响应Button事件的函数 privatevoidsetListener(){ countButton.setOnClickListener(countListner); } privateOnClickListenercountListner=newOnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub Toast.makeText(BMIActivity.this,"你是一位"+sexChoose()+"\n" +"你的身高为"+Double.parseDouble(heighText.getText().toString())+"cm" +"\n你的标准体重为"+getWeight(sexChoose(),height)+"kg",Toast.LENGTH_LONG) .show(); } }; //性别选择的函数 privateStringsexChoose(){ if(maleBtn.isChecked()){ sex="男性"; } elseif(femaleBtn.isChecked()){ sex="女性"; } returnsex; } //创建视图的函数 publicvoidcreadView(){ //txt=(TextView)findViewById(R.id.txt); countButton=(Button)findViewById(R.id.btn); heighText=(EditText)findViewById(R.id.etx); maleBtn=(RadioButton)findViewById(R.id.male); femaleBtn=(RadioButton)findViewById(R.id.female); //txt.setBackgroundResource(R.drawable.bg); } //标准体重格式化输出的函数 privateStringformat(doublenum){ NumberFormatformatter=newDecimalFormat("0.00"); Stringstr=formatter.format(num); returnstr; } //得到标准体重的函数 privateStringgetWeight(Stringsex,doubleheight){ height=Double.parseDouble(heighText.getText().toString()); Stringweight=""; if(sex.equals("男性")){ weight=format((height-80)*0.7); } else{ weight=format((height-70)*0.6); } returnweight; } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/pic" > <TextView android:id="@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@string/hello" android:textSize="16px" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/sex" /> <RadioGroup android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <RadioButton android:id="@+id/male" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="男" /> <RadioButton android:id="@+id/female" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="女" /> </RadioGroup> <TextView android:layout_width="fill_parent" android:layout_height="26px" android:text="@string/heigh" /> <EditText android:id="@+id/etx" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/count" /> </LinearLayout> 效果图: 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/700077

优秀的个人博客,低调大师

应用开发数据库之ORACLE 12C初探

简介 oracle 12c较oracle之前的版本最大的改变就是引入了CDB(Container Database)与PDB(Pluggable Database)的新特性,其引入的多租用户环境,允许一个数据库容器(CDB)承载多个可拔插的PDB。在12从之前,数据库是实例与数据库是一对一或多对一关系(RAC)。当12C之后,数据库与实例可以是多对一的关系。ORACLE 12C在JDBC方面也有所改动!传统的链接方法:jdbc:oracle:thin:@localhost:1521:orcl,新的的链接jdbc:oracle:thin:@127.0.0.1:1521/pdborcl! PDB介绍 01. oracle12C 通过默认的sqlplus / as sysdba 默认进入的使“CDB$ROOT”环境,该环境下不允许用户新建用户,否则的话会报“ORA-65096:不合法的用户或角色”。如下代码 SQL>select sys_context ('USERENV', 'CON_NAME') from dual; ---------------------------------------------------------------------------------------------------- CDB$ROOT02. 可以通过如下命名查看当前实例下有多少租户(多少数据库):如下代码: SQL>select con_id,dbid,NAME,OPEN_MODE from v$pdbs; ------------------------------------------------------------------------------- CON_ID DBID NAME OPER_MODE 2 3074450648 PDB$SEED READONLY 3 1604605593 ORCLPDB MOUNTED (备注:mounted状态,此时数据库不可用) 03. 通过使用如下命令,将其插拔上: alter pluggable database pdborcl open;此时con_ID=3的OPER_MODE状态变为“read,write”状态了,表名此时,数据库可以用了(任何数据库客户端都可以正常连接该数据库)。 04. 通过如下命名,可以在pl/sql终端进行环境(数据库)的切换 alter session set container=ORCLPDB;05.可以在该命令下,执行像单实例单数据库的操作(包括创建用户等等一系列的操作)。 ORACLE 12C JDBC操作 01. 在oracle12C之前的JDBC不能继续使用,需要更换为支持ORACLE12C的JDBC驱动程序,目前支持的版本有(ojdbc7或ojdbc8),需要官网上下载。 02. 连接方式上: oracle12c以前的连接方式不会被支持:如果url为如下地址: jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCLPDB将会抛出如下的错误信息 Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:271) at oracle.net.ns.NSProtocol.connect(NSProtocol.java:317) at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1438) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518) 正确的写法如下: jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521/ORCLPDB

优秀的个人博客,低调大师

Android应用开发—PendingIntent:如何判断两个PendingIntent对等

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/78995910 摘录自:PendingIntent详解 如何判断两个PendingIntent对等: 两个PendingIntent对等是指它们的operation一样, 且其它们的Intent的action, data, categories, components和flags都一样。但是它们的Intent的Extra可以不一样。 主要常量 FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。 FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。 FLAG_ONE_SHOT:该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。 FLAG_UPDATE_CURRENT:如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册