サブタイトル:オリジナル ライブラリ 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.javaPROJECT\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 リポジトリ
