サブタイトル:オリジナル ライブラリ jar ファイル作成と 利用パターン
再現環境
「エラー: 不適合な型: 精度が失われる可能性があるintからcharへの変換」
"error: incompatible types: possible lossy conversion from int to char".
のコンパイルエラー。
Java11から導入された「public static String toString(int codePoint )
」関数を使用する為
プロジェクト\app\build.gradle
GitHub commit 419b837d40a6995bc690610bd995167ebe07623f
ところが...▼
再現環境
Android Studio Dolphin | 2021.3.1
Build #AI-213.7172.25.2113.9014738, built on September 1, 2022
Runtime version: 11.0.13+0-b1751.21-8125866 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 11 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 8
Registry:
external.system.auto.import.disabled=true
ide.text.editor.with.preview.show.floating.toolbar=false
Android Studio Dolphin | 2021.3.1
Build #AI-213.7172.25.2113.9014738, built on September 1, 2022
Runtime version: 11.0.13+0-b1751.21-8125866 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 6
Registry:
external.system.auto.import.disabled=true
ide.text.editor.with.preview.show.floating.toolbar=false
これらの Android Studio は Java11 が使えるはずが、なぜか
int i = 0x20BB7;//ツチヨシ Unicode String str = java.lang.Character.toString( i );をビルドすると
「エラー: 不適合な型: 精度が失われる可能性があるintからcharへの変換」
"error: incompatible types: possible lossy conversion from int to char".
のコンパイルエラー。
Java11から導入された「public static String toString(int codePoint )
プロジェクト\app\build.gradle
~
android {
~
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
}
~
を指定。やみくもに検索して見つかる環境変数「JAVA_HOME」値 や、gradle.properties「org.gradle.java.home」値を指定する情報は関係なさそう。
GitHub commit 419b837d40a6995bc690610bd995167ebe07623f
ところが...▼
Android Studio に含まれる openJDK にパスを通すと単体コンパイル成功する?!
チケット:https://issuetracker.google.com/issues/251742087
暫定で次のように回避できる。openJDK 11 でコンパイル済の jar ファイルをオリジナルの外部ライブラリとする方法。
java.lang.Character.toString( i );
を
myLibrary.Character.toString( i );
として代替してみる。
GitHub commit 0ed108c97c21dc0319a162f54122ce73b2d7177d
次のようなフォルダ構成で Character.java を作成。
c アーカイブを新規作成する
f アーカイブ・ファイル名を指定する
M エントリのマニフェストファイルを作成しない
-C アーカイブする起点パス
Android Studio > File > Project Structure
Dependencies > Modules, app > Declare Dependencies, +, JAR/AAR Dependency
Step1に使いたいライブラリのパスを手打ちで入力。
Provide a path to the library file or Directory to add > libs/MyLibrary20111008.jar > ok
▼
設定ファイルなら PROJECT\app\build.gradle に1行追加するだけ。
GitHub リポジトリ
>set PATH="C:\Program Files\Android\Android Studio\jre\bin";%PATH%
>javac -version javac 11.0.13Main.java
public class Main{
public static void main( String[] args ){
int i = 0x20BB7;//ツチヨシ Unicode
String str = java.lang.Character.toString( i );
}
}
>javac Main.javaサロゲートペア文字も処理できる。該当する情報を見つけられないので、念のため Android Studio へ報告。
チケット:https://issuetracker.google.com/issues/251742087
暫定で次のように回避できる。openJDK 11 でコンパイル済の jar ファイルをオリジナルの外部ライブラリとする方法。
java.lang.Character.toString( i );
を
myLibrary.Character.toString( i );
として代替してみる。
GitHub commit 0ed108c97c21dc0319a162f54122ce73b2d7177d
次のようなフォルダ構成で Character.java を作成。
PROJECT
└─myLibrary
Character.java
PROJECT\myLibrary\Character.java
package myLibrary;
import java.lang.IllegalArgumentException;
public class Character{
public static String toString( int codePoint )throws IllegalArgumentException{
return java.lang.Character.toString( codePoint );
}
}
openJDK 11 でコンパイル。
>javac PROJECT\myLibrary\Character.javaオリジナルの外部ライブラリ MyLibrary20111008.jar ファイルを生成&配置。
>jar cfM PROJECT\app\libs\MyLibrary20111008.jar -C PROJECT myLibraryjar コマンドオプションの意味は、
c アーカイブを新規作成する
f アーカイブ・ファイル名を指定する
M エントリのマニフェストファイルを作成しない
-C アーカイブする起点パス
PROJECT
├─app
│ └─libs
│ MyLibrary20111008.jar ★これを依存関係に設定
└─myLibrary
Character.class
Character.java
この PROJECT の依存関係設定で このライブラリを利用可能に。
Android Studio > File > Project Structure
Dependencies > Modules, app > Declare Dependencies, +, JAR/AAR Dependency
Step1に使いたいライブラリのパスを手打ちで入力。
Provide a path to the library file or Directory to add > libs/MyLibrary20111008.jar > ok
▼
設定ファイルなら PROJECT\app\build.gradle に1行追加するだけ。
~
dependencies {
~
implementation files('libs/MyLibrary20111008.jar') ★
~
以上で現状の Android Studio でも java.lang.Character.toString(int codePoint ) を間接的にコンパイル&実行できる。
GitHub リポジトリ