首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Android的gluonfx nativePackage

用于Android的gluonfx nativePackage
EN

Stack Overflow用户
提问于 2021-08-02 14:38:50
回答 1查看 413关注 0票数 1

如何为类启用multiDex,以便在DexPathList上包含或跟踪它们?

我使用graalvm (带有本机映像)和gluonfx nativePackage任务来生成apk。

代码语言:javascript
复制
id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.3' //build.gradle

但是当我试图访问一个短消息BroadcastReceiver时,我在DexPathList中找不到.

这是androidManifest设置..。

代码语言:javascript
复制
     <application ... package="demo"   ...>
        <uses-permission android:name="android.permission.RECEIVE_SMS"/>
        <receiver android:name=".services.SmsListener" 
                  android:enabled="true" 
                  android:exported="true"
                  android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
     </application>

我在手机上发短信时遇到的错误如下..无法实例化接收方nativeLibraryDirectories=/data/app/...-g==/lib/arm64,:java.lang.ClassNotFoundException:没有在路径上找到类"demo.services.SmsListener“:DexPathList[zip file”/data/app/./base.apk“,DexPathList/data/app/.g==/base.apk!/lib/arm64-v8a,/system/lib 64,/system_ext/lib 64]

那么,我如何将MultiDexEnabled True传递给安卓任务呢?或者有什么方法可以通过java代码启动这个广播类?项目结构

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-06 17:08:01

最初的问题是在将项目打包到最终的APK之前,将Java代码添加到Android源代码中。

修改Android项目

由于还没有来自gluonfx插件的自动过程,这是一个手动过程:

  • 运行mvn -Pandroid gluonfx:build gluonfx:package一次,这将创建target/gluonfx/aarch64-android/gvm/android_project下的Android项目。
  • 将Java/Android源代码添加到target/gluonfx/aarch64-android/gvm/android_project/app/src/main/java
  • 手动构建APK: cd target/gluonfx/aarch64-android/gvm/android_project/导出Android_SDK_ROOT=~/..gluon/底物/Android ./gradlew应用程序:assembleDebug
  • 继续这个过程:mvn -Pandroid gluonfx:install gluonfx:run

虽然这允许修改Android部件,但主要的警告是,这端与Java/JavaFX/GraalVM部件之间缺乏通信,因此只有在Android端是一个孤立的修改的情况下,它才能工作。

创建自定义附加服务

为了修改Android部件并访问Java/JavaFX端,最好的方法是创建一个附加服务。

为此,一个选项是克隆附加,添加新服务,并发布/分发这个修改后的附加版本,但更好的方法是在附加之外创建一个自定义附加服务。

LogService

这个实验性的存储库包含一个新的服务:LogService,作为概念的证明。

自述文件已经包含了有关如何开始和使用此服务的说明。

构建服务

概括如下:

  • 确保你遵循必要条件
  • 克隆存储库
  • 构建并发布到本地:./gradlew clean publishToMavenLocal
  • 确保在~/.m2/repository/org/jpereda/attach/log/4.0.12-SNAPSHOT下有工件
代码语言:javascript
复制
   log-4.0.12-SNAPSHOT-android.jar
   log-4.0.12-SNAPSHOT-ios.jar 
   log-4.0.12-SNAPSHOT-desktop.jar
   log-4.0.12-SNAPSHOT.jar

在项目中使用LogService

假设您正在运行HelloGluon

pom

将依赖项添加到pom中。请注意,正式的附加依赖项保持不变,但需要4.0.12-快照。

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>com.gluonhq.attach</groupId>
        <artifactId>storage</artifactId>
        <version>4.0.12-SNAPSHOT</version>
    </dependency>
    ...
    <dependency>
        <groupId>org.jpereda.attach</groupId>
        <artifactId>log</artifactId>
        <version>4.0.12-SNAPSHOT</version>
    </dependency>
</dependencies>

<repositories>
        <repository>
            <id>snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </repository>
    </repositories>

注意,由于它不是正式的附加服务,所以它不能使用包名com.gluonhq.attach,也不能添加到attachList中。因此,它被视为一个常规依赖项,您需要根据目标添加平台依赖项:

例如,对于Android:

代码语言:javascript
复制
        <profile>
            <id>android</id>
            <properties>
                <gluonfx.target>android</gluonfx.target>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.jpereda.attach</groupId>
                    <artifactId>log</artifactId>
                    <version>4.0.12-SNAPSHOT</version>
                    <classifier>android</classifier>
                    <scope>runtime</scope>
                </dependency>
            </dependencies>
        </profile>

代码

从您的代码中,像往常一样调用服务:

代码语言:javascript
复制
LogService.create().ifPresent(service -> service.log("This is a message"));

测试服务

例如,在Android上:

代码语言:javascript
复制
mvn -Pandroid gluonfx:build gluonfx:package gluonfx:install gluonfx:nativerun

创建您自己的服务

首先,阅读接口以更好地理解附加服务。

遵循LogService 项目,创建自己的服务应该比较简单。

更复杂的部分是Java(11+)/JavaFX/GraalVM与Java(7)/Android之间的通信,其中需要JNI。Java端是编译后进入lib${service}.a的AOT,而安卓端则以${service}>.aar的形式发布到Android项目中,没有JavaFX支持。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68623490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档