cocos2d demo把跳转activity报错

cocos2d 把appActivity放着第二个activity就报错,非启动时的activity。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
8-14 00:16:33.371 9119-9119/org.cocos2d.examplecases E/art: No implementation found for void org.cocos2dx.javascript.SDKWrapper.nativeLoadAllPlugins() (tried Java_org_cocos2dx_javascript_SDKWrapper_nativeLoadAllPlugins and Java_org_cocos2dx_javascript_SDKWrapper_nativeLoadAllPlugins__)
08-14 00:16:33.376 9119-9119/org.cocos2d.examplecases E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.cocos2d.examplecases, PID: 9119
java.lang.UnsatisfiedLinkError: No implementation found for void org.cocos2dx.javascript.SDKWrapper.nativeLoadAllPlugins() (tried Java_org_cocos2dx_javascript_SDKWrapper_nativeLoadAllPlugins and Java_org_cocos2dx_javascript_SDKWrapper_nativeLoadAllPlugins__)
at org.cocos2dx.javascript.SDKWrapper.nativeLoadAllPlugins(Native Method)
at org.cocos2dx.javascript.SDKWrapper.init(SDKWrapper.java:64)
at org.cocos2dx.javascript.AppActivity2.onCreate(AppActivity2.java:48)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

还没找到原因!

kotlin实践


Apple.kt
val fun(name:String) {
println(name)
}
in kotlin
Apple.fun()
in java
AppleKt.fun()


object关键词声明同时是单例的写法:
object Apple {
fun echo(name:String) {
println(name)
}
}
in kotlin
Apple.echo()
in java
Apple.INSTANCE.echo()


kotlin中class作为参数的写法
fun main(args: Array<String>) {
test(JavaObject::class.java)
test(KotlinObject::class)
}
fun test(clazz: Class<JavaObject>) {
println(clazz.simpleName)
}
fun test(clazz: KClass<KotlinObject>) {
println(clazz.simpleName)
}


java中的in变量在kotlin中是关键字
public class JavaObject {
public static final String in = “int”;
}
调用:
println(JavaObject.in)


kotlin是没有封装类的,比如Integer
如何通过反射去调用Integer类型

在调用java代码的时候,在不确定是否是非空且安全的,一定要声明成可空安全的类型,如string? string?.length
假设两种情况 :string :string! (兼容类型,暂时存在),就会导致报错


用注解@jvmStatic,修饰类成员方法,可以让调用简化:
如:
object Test {
@jvmStatic
fun test() {
}
}

Test.test(),
假设不加注解@jvmStatic,调用就是Test.Instance.test()


函数
1 .函数可以省略{} 写在fun函数后面
fun getName(name: String = “me “):String?= “ hello “

2.函数嵌套
不推荐使用,降低代码可读性
在某些条件下触发递归的函数,或者不希望被外部函数访问到的函数,
如,对外只是function,say不被外部函数访问
fun function() {
val str = “hello”
fun say(count: Int) {
println(“$str,$count”)
if (count > 0) {
say(count - 1)
}
}
say(5)
}


扩展函数
静态的给一个类添加一个方法或者一个变量,不具备运行时多态
扩展成员方法,成员变量
fun KtObject.hello: String = “ hello “

in java
KtObjectKt.hello(object) 有待验证


闭包
val echo = {
name: String ->
println(name)
}
echo(“hello”)

原理:就是匿名内部类
lambda参数上限是22个,可以手动定义在延长这个上限


高阶函数,
类里的方法可以当作参数赋值,
inline建议只用于高阶函数,不然会加重编译器的负担,等于把语句嵌进去

inline fun onlyif(isDebug: Boolean, block: ()->Unit) {
if (isDebug) {
block()
}
}
fun main(args: Array<String>) {

val runnable = Runnable {  
    println("runnable")  
}  

val function: () -\> Unit  
function = runnable::run  

onlyif(true, function)  

}


类与对象
class A:B {}
open class

open class(var int:Int): B(){
val v
init{
v = 5
}
constructor(int :Int):super(int)
constructor(int:int, str:String):this(int)

}

伴生对象,,,单例
kotlin 是没有static关键字的
private
protected
publick
internal 模块内可以访问,,,即module
伴生对象:
class A {
companion object {
fun isEmpty(str:String?): Boolean {}
}
}

kotlin A.isEmpty(xxx)
java A.Companion.isEmpty(xxx) 生成一个static对象Compantion

伴生对象用来生成单例

class Single private constructor() {
companion object {
fun get(): Single() {
return Holder.instance
}
}
private object Holder {
val instance = Single()
}
}

java动态代理就是指一般静态代理基础上,为了解决静态代理需要写很多代理方法带来的重复工作,从而利用放射在运行时自动去寻找对应的代理方法。
kotlin的动态代理 使用by关键字

如果是以前java,一般做法是采用静态代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
interface Animal {
fun bark()
fun jump()
}

class Dog: Animal {
override fun jump() {
println("jump")
}

override fun bark() {
println("bark")
}
}

//静态代理类
class Zoo(animal: Animal): Animal{
var mAnimal: Animal? = null
init {
mAnimal = animal
}
override fun jump() {
mAnimal?.jump()
}
override fun bark() {
mAnimal?.bark()
}
}

class TestAnimal {
companion object {
@JvmStatic
fun main(args: Array<String>) {
Zoo(Dog()).bark()
Zoo(Dog()).jump()
}

}
}

kotlin使用by关键字来做伪动态代理,而不用反射,最终编译成静态代理

1
class Zoo(animal: Animal): Animal by animal

kotlin 枚举类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
enum class Command {
A, B, C, D
}

fun exec(command: Command) = when(command) {
A -> {
println("A!")
}
B -> {
println("B!")
}
C -> {
println("C!")
}
D -> {
println("D!")
}
}

kotlin 密封类《超级枚举类》 暂时不知道exec有什么好处

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
sealed class SuperCommand {
object A : SuperCommand()
object B : SuperCommand()
object C : SuperCommand()
object D : SuperCommand()
class E(var id: Int) : SuperCommand()
}

fun exec(superCommand: SuperCommand) = when(superCommand) {
SuperCommand.A -> {
println("AA")
}
SuperCommand.B -> {
println("BB")

}
SuperCommand.C -> {
println("CC")

}
SuperCommand.D -> {
println("DD")

}
is SuperCommand.E -> {
println("EE")
}
}

oop

1
2
3
1interface+实现类,消除ifelse类的代码,把动作赋给对象
2、代理类代理interface,以便对interface的统一修改,也可以视为不要污染了原来的类
3、每个类都有自己的行为,如果不是这个类发出的,抽出去独立的类实现

android悬浮窗

##悬浮窗具体的做法

小米5,7.0

1
2
3
4
5
6
7
if (Build.VERSION.SDK_INT \>= Build.VERSION_CODES.O) {
param.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else if (Build.VERSION.SDK_INT \>= Build.VERSION_CODES.N){
param.type = WindowManager.LayoutParams.TYPE_PHONE;//判断是否是洗小米系统,如果是,使用toast.settext去实现
} else {
param.type = WindowManager.LayoutParams.TYPE_TOAST;
}

https://blog.csdn.net/yhaolpz/article/details/78527803

https://github.com/yhaolpz/FloatWindow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams param = new WindowManager.LayoutParams();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
param.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
param.type = WindowManager.LayoutParams.TYPE_PHONE;
} else {
param.type = WindowManager.LayoutParams.TYPE_TOAST;
}
param.format = PixelFormat.TRANSLUCENT;
param.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; // 不能抢占聚焦点
param.flags = param.flags | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
param.flags = param.flags | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; // 排版不受限制

param.alpha = 1f;
param.gravity = Gravity.CENTER; //调整悬浮窗口至左上角
param.x = 0;
param.y = 0;
final View v = LayoutInflater.from(context).inflate(R.layout.dialog_buy_share, null);

Button btnPopup = (Button) v.findViewById(R.id.confirm_btn);
Button btnCancel = (Button) v.findViewById(R.id.cancel_btn);

if (!TextUtils.isEmpty(bean.getButtonText())) {
btnPopup.setText(bean.getButtonText());
}

btnPopup.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
StatisticsUtils.statisticsEvent(context, "购买成功页popup_点击_分享", "活动名称", "邀请");
windowManager.removeView(v);
if (bean != null && ActivityManager.getInstance().currentActivity() != null) {
RedirectActivityUtils.redirectPage(ActivityManager.getInstance().currentActivity(), bean);
// ActivityMapManager.finishActivity(InvestSuccessActivity.class.getSimpleName());
// ActivityMapManager.finishActivity(BuyFixResultCountDownActivity.class.getSimpleName());
}
}
});
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
windowManager.removeView(v);
}
});
if (windowManager != null) {
windowManager.addView(v, param);
}

命令行让gradle下载新的库的奇怪问题

发现改成gradle3.0后直接gradle xxx,找不到google

1
Could not find method google() for arguments []() on repository container.
1
背景:原来旧项目采用gradle3.3,后面升级后改成了gradle4.4,结果gradle没法自己下载,如果在android studio,使用sync project with gradle files,但命令没有。
  • 解决方案
  • 1
    ./gradlew

而不是使用

1
gradle clean build

kotlin androidstudio Function main not found in class Main

解决方法:

1
2
3
4
5
6
7
8
9
10
Change you class for an object and add platformStatic to your main method
object Main {
  platformStatic fun main(args: Array<String>){
  println("Hello kotlin")
  }
}
or put your main function outside the class
fun main(args: Array<String>){
  println("Hello kotlin")
}

更新gradle插件后的出错

出现:

Cannot choose between the following configurations of project :UmengSocialSdkLibrary:
debugApiElements
debugRuntimeElements
releaseApiElements
releaseRuntimeElements
All of them match the consumer attributes:
Configuration 'debugApiElements':
    Found com.android.build.api.attributes.BuildTypeAttr 'debug' but wasn't required.
    Found com.android.build.api.attributes.VariantAttr 'debug' but wasn't required.
    Found com.android.build.gradle.internal.dependency.AndroidTypeAttr 'Aar' but wasn't required.
    Found org.gradle.usage 'java-api' but wasn't required.

原因是更新了gradle插件,

classpath 'com.android.tools.build:gradle:3.2.0-alpha07'

解决方案:

compile project(':UmengSocialSdkLibrary')

改成:

compile project(path: ':UmengSocialSdkLibrary', configuration: 'default')

编译出现Error:In \<declare-styleable\> FontFamilyFont, unable to find

加入kotlin的辅助库androidx.core:core-ktx:0.3,结果编译出现FontFamilyF可能是引入的新版ont的error

思路:

可能是引入的新版本的appcompat的库

先列出本工程的所有依赖关系,命令

gradle :app:dependencies --configuration compile

工程的依赖关系

…
+--- com.android.support:appcompat-v7:25.3.1
+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.30
|    +--- org.jetbrains.kotlin:kotlin-stdlib:1.2.30 -> 1.2.31
|    |    \--- org.jetbrains:annotations:13.0
|    \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.30
|         \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.30 -> 1.2.31 (*)
\--- androidx.core:core-ktx:0.3
     +--- com.android.support:support-annotations:27.1.0
     +--- org.jetbrains.kotlin:kotlin-stdlib:1.2.31 (*)
     \--- com.android.support:support-compat:27.1.0 (*)*

发现core-ktx引入的27.1.0的compat库,所以只要把这个compat去掉,或者更新我们项目资金的compat到27.1.0,问题就解决了。

解决方案:

compile ("androidx.core:core-ktx:0.3") {
exclude group: 'com.android.support', module: 'support-compat'
}