Java – returning an int from a native function (C, JNI) causes the application to crash
Trying to figure out why returning an int from a C function call causes the entire application to crash without any errors / warnings
This is the working code:
jint Java_org_ntorrent_DummyTorrentInfoProvider_next( jnienv * env,jobject obj,jint number) { jint test = rand(); __android_log_print(ANDROID_LOG_DEBUG,"HelloNDK!","rand() = %d",test); return number; }
This code crashes the application without warning:
jint Java_org_ntorrent_DummyTorrentInfoProvider_next( jnienv * env,test); return number + test; }
Before the application crashes, I can see my log message (_ android_log_print) in log cat
Edit: even if I replace "digital test" with "1", the application still crashes... It only works when I return "number"
Edit #2: Java side code:
package org.ntorrent; import java.util.ArrayList; import java.util.Random; public class DummyTorrentInfoProvider implements TorrentInfoProvider { public native Integer next(Integer number); //public Integer next() { return _random.nextInt(); } public native void test(); private Random _random = new Random(100); @Override public ArrayList getTorrents() { test(); ArrayList torrents = new ArrayList(); torrents.add( new TorrentInfo("test torrent number 1",next(1),3f,5f)); torrents.add( new TorrentInfo("test torrent number 2",next(2),4f,15f)); torrents.add( new TorrentInfo("test torrent number 555")); torrents.add( new TorrentInfo("test torrent number 3",next(3),13f,5f)); return torrents; } static { System.loadLibrary("test"); } }
Solution
jint Java_org_ntorrent_DummyTorrentInfoProvider_next(
jint Java_org_ntorrent_DummyTorrentInfoProvider_next( jnienv * env,jint number)
and
public native Integer next(Integer number);
Non conformity Integer is an object and int is a primitive
If your native code uses jint, your Java code should use int
(if you want to pass an integer, you need to treat it as a native job and skip the hoop to access it - it may be easier to use int / jint and make any necessary transformations in integer. Java)