extraText :: String -> String
extraText who = "\nHello, " ++ who ++ "!"
public class FregeActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView) findViewById(R.id.txt);
textView.append(FregeCode.extraText("Android"));
}
}
看起来像这样
我的示例项目使用的是Frege 3.23,因此您可以使用从Java调用Frege的旧方法。我没有尝试过使用Frege 3.24,但如果您想尝试,您需要使用新的方法。
唯一真正棘手的部分是得到一个可以构建Frege代码的build.gradle
。我从Frege邮件列表中Andreas Ländle发布的片段开始,然后将其完善为完整的build.gradle。我无法使Proguard工作,因此生成的APK包含整个frege.jar
。这会使应用程序有点臃肿,并且需要打开Multidex,但除此之外似乎没有问题。
另外,请注意我的示例项目需要 API Level 21 或更高版本,因为 Frege 需要 ForkJoinPool,而 Android 只在 21 及以上版本中才有。
我对Frege不熟悉,也没有尝试在Android上使用Scala或其他JVM语言。
那么说了这些,如果我要尝试类似的东西,以下是我可能采取的步骤来尝试弄清楚如何使其正常工作:
在Frege中构建一个简单的基于命令行的HelloWorld类型应用程序,该应用程序可以通过例如`java -jar HelloWorld.jar HelloWorld`来运行
对HelloWorld.jar运行dx,然后尝试从adb shell使用dalvikvm在Android设备上运行该示例,即`dalvikvm -cp blah.dex HelloWorld`
找出如何在Frege中引用/使用Android sdk提供的android.jar中的类
在Frege中构建一个简单的POC Activity类,并手动从中构建一个classes.dex文件
在Java中构建类似的POC应用程序,并使用现有的Android工具构建一个apk
替换apk中的classes.dex,重新签名apk,然后查看是否可行
如果您已经成功完成这些操作,则可以继续开发更好的Frege构建方案,使用aapt编译资源并最终从头开始构建完整的apk。
如果有人仍然感兴趣,我在这里写了一篇关于它的博客文章(链接)。您需要设置gradle构建以将Frege代码编译为Java并将其放入Java源路径中。然后,您需要子类化activity并定义一些自定义包装器。
data Bundle = native android.os.Bundle
data Context = native android.content.Context
data FregeActivity = native android.app.Activity where
native getApplicationContext :: MutableIO FregeActivity -> IO (MutableIO Context)
native setContentView :: MutableIO FregeActivity -> MutableIO TextView -> IO ()
data TextView = native android.widget.TextView where
native new :: MutableIO Context -> STMutable RealWorld TextView
native setText :: MutableIO TextView -> String -> IO ()
onCreateF :: MutableIO FregeActivity -> IO ()
onCreateF !this = do
context <- this.getApplicationContext
tv <- TextView.new context
tv.setText "Hello, Android - Love, Frege"
this.setContentView tv
native module type FregeActivity where {
@Override
public void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final frege.run7.Func.U<Object,Short> res = RunTM.<frege.run7.Func.U<Object,Short>>cast(onCreateF(this)).call();
frege.prelude.PreludeBase.TST.run(res).call();
}
}
https://groups.google.com/forum/#!topic/frege-programming-language/Ounzmu-oHJQ https://groups.google.com/forum/#!topic/frege-programming-language/8bkWorojiiY
我也希望有一种具备参数多态和特定多态的参照透明、强类型语言可用于进行Android开发。虽然目前还没有这样的语言,但我推荐使用Scala进行Android开发。