@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();
}
}
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.
Most helpful comment
thanks @tipsy for the quick response.