当前位置:   article > 正文

kotlin和java混合开发总结_android decompile kotlin to java

android decompile kotlin to java

声明:本文是作者AWeiLoveAndroid原创,版权归作者AWeiLoveAndroid所有,侵权必究。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!

我本来是不想学习kotlin的,但是现在的形势,很多公司都在使用kotlin开发,可以说学会kotlin也是无奈之举,既然是潮流,谷歌也在大力推广,所以还是只能硬着头皮逼迫自己学一下,也能更快适应公司的需要。正所谓:“识时务者为俊杰”,改变不了公司的发展,那就改变自己。本文首发在 慕课网,转载请注明原文链接和作者信息。

废话少说,直接上正题。本文主要讲解kotlin和java混合开发的一个初探。这是一个入门篇的总结博客。我这里使用的Kotlin版本是最新的版本,版本号是 1.3.0


目录

本文配套源码请看github:https://github.com/AweiLoveAndroid/Kotlin-learn/


一、Kotlin集成步骤和注意事项(基于Kotlin1.3.0):

1.在工程根目录的 build.gradle 里面的 buildscript 节点的 dependencies 子节点 添加一行依赖:

  1. buildscript {
  2. dependencies {
  3. // 添加这一行依赖
  4. classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  5. }
  6. }

2.在工程根目录 build.gradlebuildscript节点 配置kotlin版本号:

  1. buildscript {
  2. ext.kotlin_version = '1.3.0'
  3. ...
  4. }

3.在项目module的 build.gradle 的顶部添加以下代码:

  1. apply plugin: 'kotlin-android'
  2. apply plugin: 'kotlin-android-extensions'

4.在项目module的 build.gradledependencies 节点里添加以下代码:

  1. dependencies {
  2. implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
  3. }

5.注意事项:

1.本地kotlin版本路径:

Android Studio安装根路径/gradle/m2repository/org/jetbrains/kotlin/kotlin-stdlib/

2.不同了版本的依赖库

  1. 1.2.0以前使用这个依赖库
  2. implementation "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
  3. 1.2.0+版本使用这个依赖库
  4. implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

3.Tools --> kotlin --> Decompiler Kotlin to Java,如果该选项是灰色,请下载插件 Java Bytecode Decompiler

4.这几个依赖库的区别:

依赖库名称含义
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"1.2.0版本以前使用的配置,兼容java7
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"1.2.0以前使用的配置,兼容java8
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"1.2.0+版本以前使用的配置,兼容java7
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"1.2.0+版本使用的配置,兼容java8

5.Kotlin下载到本地的路径在哪里?

工程目录的末尾有个External Libraries,选择某一个kotlin的jar包,打开,
右键选择 Show in Explorer,就可以看到kotlin的jar包和资源下载在本地的路径了。

如下图所示:

kotlin的所有jar下载的路径为:
C:/Users/Administrator/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/
Users是我的电脑名。

如下图所示:


二、Kotlin和Java文件互相转换

(1)Java转Kotlin

  • 1.选中Java文件,点击菜单栏Code-->Convert Java File to Kotlin File ,即可把java文件转换成kotlin文件。

  • 2.点击右上角提示的 configue ,然后会出现一个弹窗。

  • 3.设置工程里面哪些需要配置kotlin文件支持。比如我这里选中的是single module,module名为kotlinlibrary。还可以选择kotlin的编译和运行版本号,比如我选择的1.2.30,然后点击OK即可,如下图所示。

  • 4.然后我们就可以看到项目根路径的build.gradlekotlinlibrary这个module的build.gradle都做了kotlin的配置。如图所示:

根路径的 build.gradle 配置:

kotlinlibrarybuild.gradle 配置:

(2)Kotlin转Java

点击菜单栏Tools-->Kotlin-->Decompile Kotlin To Java 就可以了,我用的AS3.1.3,不知道为啥我的是灰色的?有人可以告诉我原因吗?


三、Kotlin项目里面集成Java的module

这一部分源码请看github:https://github.com/AweiLoveAndroid/Kotlin-learn/tree/master/KotlinAndJavaDemo

(1)创建一个名为 KotlinAndJavaDemo 的项目创建一个module,取名为JavaModule,跟普通创建一样,只是最后一步要选择使用的语言是Java,如图所示:


(2)项目代码和平常使用Java开发一样。

代码、资源文件、预览图都和平时开发是一样的。


(3)如果我们是一个Java的lib库,kotlin也是可以直接调用的。

我的kotlin的module名为app, 依赖了一个java的名为javalibrary的lib。我需要在app里面使用javalibraryResourcesUtils,然后获取状态栏高度,如果成功,就弹吐司显示状态栏高度。

这个是javalibraryResourcesUtils

  1. /**
  2. * 描述:
  3. * 资源工具类
  4. */
  5. public class ResourcesUtils {
  6. /**
  7. * 获取状态栏高度
  8. * @return 状态栏高度
  9. */
  10. public static int getStatusBarHeight(Context context) {
  11. //获取status_bar_height资源的ID
  12. int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
  13. if (resourceId > 0) {
  14. //根据资源ID获取响应的尺寸值
  15. return context.getResources().getDimensionPixelSize(resourceId);
  16. } else {
  17. return dip2px(context,24f);
  18. }
  19. }
  20. // dp 转成 px
  21. private static int dip2px(Context context, Float dpValue) {
  22. float scale = context.getResources().getDisplayMetrics().density;
  23. return (int) (dpValue * scale + 0.5f);
  24. }
  25. }

再来看看appMainActivity里面的使用:

  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. init(this)
  6. }
  7. fun init(context: Context) {
  8. val statusBarHeight = ResourcesUtils.getStatusBarHeight(context)
  9. Toast.makeText(context, "状态栏高度为:$statusBarHeight",Toast.LENGTH_SHORT).show()
  10. }
  11. }

(4)我们在看看看完整的工程结构图


四、Java项目里面集成Kotlin的module

这一部分源码请看github:https://github.com/AweiLoveAndroid/Kotlin-learn/tree/master/JavaAndKotlinDemo

(1)创建一个名为 KotlinAndJavaDemo 的项目创建一个module,取名为KotlinModule,跟普通创建一样,只是最后一步要选择使用的语言是Kotlin,如图所示:


(2)项目代码和平常使用Kotlin开发一样。


(3)如果我们是一个Kotlin的lib库,Java也是可以直接调用的。

我的Java的module名为app, 依赖了一个Kotlin的名为kotlinlibrary的lib。我需要在app里面使用kotlinlibraryResourcesUtils,然后获取状态栏高度,如果成功,就弹吐司显示状态栏高度。

这个是kotlinlibraryResourcesUtils

  1. package com.lzw.kotlinlibrary
  2. import android.content.Context
  3. /**
  4. * 描述:
  5. * 资源工具类
  6. */
  7. class ResourcesUtils {
  8. // 伴生对象 这里面包裹的方法 实际上类似于java的静态方法
  9. companion object {
  10. /**
  11. * 获取状态栏高度
  12. * @return 状态栏高度
  13. */
  14. fun getStatusBarHeight(context: Context): Int {
  15. //获取status_bar_height资源的ID
  16. val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
  17. return if (resourceId > 0) {
  18. //根据资源ID获取响应的尺寸值
  19. context.resources.getDimensionPixelSize(resourceId)
  20. } else {
  21. dip2px(context, 40f)
  22. }
  23. }
  24. /**
  25. * dp 转 px(像素)
  26. */
  27. fun dip2px(context: Context, dpValue: Float?): Int {
  28. val scale = context.resources.displayMetrics.density
  29. return (dpValue!! * scale + 0.5f).toInt()
  30. }
  31. /**
  32. * px(像素) 的单位 转 dp
  33. */
  34. fun px2dip(context: Context, pxValue: Float?): Int {
  35. val scale = context.resources.displayMetrics.density
  36. return (pxValue!! / scale + 0.5f).toInt()
  37. }
  38. }
  39. }

再来看看appMainActivity里面的使用:

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. init(this);
  7. }
  8. private void init(Context context) {
  9. int statusBarHeight = ResourcesUtils.Companion.getStatusBarHeight(context);
  10. Toast.makeText(context, "状态栏高度为:" + statusBarHeight + "像素",Toast.LENGTH_SHORT).show();
  11. }
  12. }

(4)我们在看看看完整的工程结构图

image


五、同一个module同时使用Java和Kotlin

(一)给kotlin文件单独配置文件路径

我们还是拿第一个前面的工程KotlinAndJavaDemo为例,我在moduleapp里面同时使用kotlin和java两种语言做开发。 为了便于区分,需要在该module的build.gradle文件做配置。

默认情况,Kotlin文件存放在src/main/java/文件夹下。若是需要隔开java文件和Kotlin文件,我们可以指定一个专门存放Kotlin文件的文件夹, 首先在src/main目录下创建文件夹kotlin,然后做以下配置:

  1. android {
  2. // 配置一个路径专门存放kotlin文件
  3. sourceSets {
  4. main.java.srcDirs += 'src/main/kotlin'
  5. }

图示如下:

(二)代码里面的使用

(1)如果主工程是kotlin写的,部分是Java写的。

比如Activity是kotlin写的,工具类是java写的,实例代码如下:

  1. package com.lzw.kotlinandjavademo
  2. import android.content.Context
  3. import android.os.Bundle
  4. import android.support.v7.app.AppCompatActivity
  5. import android.util.Log
  6. import android.widget.Toast
  7. // 使用本包名里面的对应文件
  8. import com.lzw.kotlinandjavademo.util.ResourcesUtils
  9. class MainActivity : AppCompatActivity() {
  10. override fun onCreate(savedInstanceState: Bundle?) {
  11. super.onCreate(savedInstanceState)
  12. setContentView(R.layout.activity_main)
  13. init(this)
  14. }
  15. fun init(context: Context) {
  16. val statusBarHeight = ResourcesUtils.getStatusBarHeight(context)
  17. Toast.makeText(context, "状态栏高度为:$statusBarHeight 像素", Toast.LENGTH_SHORT).show()
  18. Log.e("tag", "状态栏高度为:$statusBarHeight 像素")
  19. }
  20. }

工程目录结构如图所示:

(2)如果主工程是Java写的,部分是Kotlin写的。

比如Activity是Java写的,工具类是kotlin写的,实例代码如下:

  1. package com.lzw.javaandkotlindemo;
  2. import android.content.Context;
  3. import android.os.Bundle;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.widget.Toast;
  6. import com.lzw.javaandkotlindemo.util.ResourcesUtils;
  7. public class MainActivity extends AppCompatActivity {
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. init(this);
  13. }
  14. private void init(Context context) {
  15. int statusBarHeight = ResourcesUtils.Companion.getStatusBarHeight(context);
  16. Toast.makeText(context, "状态栏高度为:" + statusBarHeight + "像素",Toast.LENGTH_SHORT).show();
  17. }
  18. }

工程目录结构如图所示:


作者:AWeiLoveAndroid
链接:https://www.jianshu.com/p/9220227cdfb3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/580834
推荐阅读
相关标签
  

闽ICP备14008679号