Monday 4 December 2017

java - Invoking JNI functions in Android package name containing underscore

itemprop="text">

I am trying to implement MP3 encoding
in Android using the LAME library following these guides:
href="https://stackoverflow.com/questions/8632835/lame-mp3-encoder-compile-for-android">Lame
MP3 Encoder compile for Android
href="http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on-Android-with-JNI"
rel="noreferrer">http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on-Android-with-JNI



However
I am getting a java.lang.UnsatisfiedLinkError which I believe might be due to the fact
that my package name contains an underscore which it interprets as a full stop
.



Looking at my code below is this likely this
issue and how do I get around that. Or is there something else causing this. Thanks in
advance for any
help.




Record.java:



package
co.uk.ing_simmons.aberdeensoundsites;

public class Record extends
Activity implements OnClickListener {

static {

System.loadLibrary("mp3lame");
}


private
native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int
quality);

private native void
destroyEncoder();

private native int encodeFile(String sourcePath,
String
targetPath);

[.....]
}



wrapper.c:



void
Java_co_uk_ing_simmons_aberdeensoundsites_Record_initEncoder(JNIEnv *env,

jobject jobj, jint in_num_channels, jint in_samplerate, jint in_brate,
jint
in_mode, jint in_quality)
{
[....]


Full
log cat
error
:




04-17
20:58:36.009: E/AndroidRuntime(26768): FATAL EXCEPTION: main
04-17
20:58:36.009: E/AndroidRuntime(26768): java.lang.UnsatisfiedLinkError:
initEncoder
04-17 20:58:36.009: E/AndroidRuntime(26768): at
co.uk.ing_simmons.aberdeensoundsites.Record.initEncoder(Native Method)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
co.uk.ing_simmons.aberdeensoundsites.Record.onCreate(Record.java:79)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
android.os.Handler.dispatchMessage(Handler.java:99)

04-17
20:58:36.009: E/AndroidRuntime(26768): at
android.os.Looper.loop(Looper.java:123)
04-17 20:58:36.009:
E/AndroidRuntime(26768): at
android.app.ActivityThread.main(ActivityThread.java:3687)
04-17 20:58:36.009:
E/AndroidRuntime(26768): at java.lang.reflect.Method.invokeNative(Native
Method)
04-17 20:58:36.009: E/AndroidRuntime(26768): at
java.lang.reflect.Method.invoke(Method.java:507)
04-17 20:58:36.009:
E/AndroidRuntime(26768): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-17
20:58:36.009: E/AndroidRuntime(26768): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-17
20:58:36.009: E/AndroidRuntime(26768): at dalvik.system.NativeStart.main(Native
Method)

class="post-text" itemprop="text">
class="normal">Answer



You should
follow the underscore with the number 1. So if your package name contains ing_simmons
then your JNI would be formed like
so.




void
Java_co_uk_ing_1simmons_aberdeensoundsites_Record_initEncoder


This
is true also if you have underscores in any other part of the call, such as class name
or method name in the Java file.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...