Javalin: Running server on Android using Javalin

Created on 3 Jun 2019  路  4Comments  路  Source: tipsy/javalin

@tipsy @felislynx-silae @robinvanyang

I am trying to run a web server on an Android device using the Javalin framework.

What do i need to make it work ? I followed the suggestions from https://github.com/tipsy/javalin/issues/185. (Since that issue was closed, i am raising a new one.)
I am getting below error while starting the server ->

W/System.err: [main] INFO io.javalin.Javalin - Starting Javalin ... com.example.javalin W/System.err: [main] ERROR io.javalin.Javalin - Failed to start Javalin com.example.javalin D/AndroidRuntime: Shutting down VM com.example.javalin E/AndroidRuntime: FATAL EXCEPTION: main
`

Process: com.example.javalin, PID: 18133
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.javalin/com.example.javalin.MainActivity}: java.lang.RuntimeException: Port 1-1023 require elevated privileges (process must be started by admin).
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2951)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6718)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: java.lang.RuntimeException: Port 1-1023 require elevated privileges (process must be started by admin).
    at io.javalin.Javalin.start(Javalin.java:159)
    at io.javalin.Javalin.start(Javalin.java:119)
    at com.example.javalin.HelloWorld.main(HelloWorld.java:9)
    at com.example.javalin.MainActivity.onCreate(MainActivity.java:17)
    at android.app.Activity.performCreate(Activity.java:7144)
    at android.app.Activity.performCreate(Activity.java:7135)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)聽
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)聽
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)聽
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)聽
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)聽
    at android.os.Handler.dispatchMessage(Handler.java:106)聽
    at android.os.Looper.loop(Looper.java:193)聽
    at android.app.ActivityThread.main(ActivityThread.java:6718)聽
    at java.lang.reflect.Method.invoke(Native Method)聽
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)聽
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)聽
 Caused by: java.net.SocketException: Permission denied
    at sun.nio.ch.Net.socket0(Native Method)
    at sun.nio.ch.Net.serverSocket(Net.java:424)
    at sun.nio.ch.ServerSocketChannelImpl.<init>(ServerSocketChannelImpl.java:88)
    at sun.nio.ch.SelectorProviderImpl.openServerSocketChannel(SelectorProviderImpl.java:56)
    at java.nio.channels.ServerSocketChannel.open(ServerSocketChannel.java:108)
    at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:336)
    at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:308)
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.server.Server.doStart(Server.java:394)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at io.javalin.core.util.JettyServerUtil.initialize(JettyServerUtil.kt:110)
    at io.javalin.Javalin.start(Javalin.java:140)
    at io.javalin.Javalin.start(Javalin.java:119)聽
    at com.example.javalin.HelloWorld.main(HelloWorld.java:9)聽
    at com.example.javalin.MainActivity.onCreate(MainActivity.java:17)聽
    at android.app.Activity.performCreate(Activity.java:7144)聽
    at android.app.Activity.performCreate(Activity.java:7135)聽
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)聽
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2931)聽
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)聽
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)聽
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)聽
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)聽
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)聽
    at android.os.Handler.dispatchMessage(Handler.java:106)聽
    at android.os.Looper.loop(Looper.java:193)聽
    at android.app.ActivityThread.main(ActivityThread.java:6718)聽
    at java.lang.reflect.Method.invoke(Native Method)聽
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)聽
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

`

Here is my code :

Build.gradle:

`
compileSdkVersion 28

defaultConfig {
    applicationId "com.example.javalin"
    minSdkVersion 28
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

`

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

implementation 'io.javalin:javalin:2.8.0' implementation 'org.slf4j:slf4j-simple:1.7.26'

gradle.properties

android.enableD8=true

HelloWorld.java . <- has the server

`import io.javalin.Javalin;

public class HelloWorld {
public static void main() {

    Javalin app = Javalin.create();
    app.start(8080);
    app.get("/", ctx -> ctx.result("Hello World"));
}

}`

MainActivity.java <- calls HelloWorld to start the server

`public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    HelloWorld.main();

}
}

QUESTION

Most helpful comment

thanks @tipsy for the quick response.

All 4 comments

Your error message doesn't match your code, it says Caused by: java.lang.RuntimeException: Port 1-1023 require elevated privileges (process must be started by admin).. but your code shows port 8080. Are you sure you're trying to start the server on 8080?

Was missing the internet permission.

Worked after adding in Manifest file
<uses-permission android:name="android.permission.INTERNET"/>

Any idea why it would work only on Android API level 28 ?

I think Jetty uses some Java APIs that aren't available for older versions of Android.

thanks @tipsy for the quick response.

Was this page helpful?
0 / 5 - 0 ratings