« Basic Activity 備忘録 | メイン | Image Asset ツールが起動しない?! »

Android

Java11から導入された関数が使えない?!

サブタイトル:オリジナル ライブラリ jar ファイル作成と 利用パターン
再現環境
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 にパスを通すと単体コンパイル成功する?!
>set PATH="C:\Program Files\Android\Android Studio\jre\bin";%PATH%
>javac -version
javac 11.0.13
Main.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 myLibrary
jar コマンドオプションの意味は、
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 リポジトリ

トラックバック

このエントリーのトラックバックURL:
https://www.remix.asia/cgi/mt/mt-tb.cgi/7742

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)