Reputation: 3131
I keep getting this error when making calls to my native methods compiled in an .SO file. i dont why its happening since everything seems to be set up right any help would be appreciated
error:
java.lang.UnsatisfiedLinkError: Native method not found: de.jurihock.voicesmith.dsp.Math.abs:(FF)F
at de.jurihock.voicesmith.dsp.Math.abs(Native Method)
cpp file: pastebin.com/aBHNz642
Math.java
package de.jurihock.voicesmith.dsp;
public final class Math
{
static
{
System.loadLibrary("Voicesmith");
}
public static final float PI = (float) java.lang.Math.PI;
public static int round(float value)
{
return java.lang.Math.round(value);
}
public static native float pow(float base, float exponent);
public static native float log10(float value);
public static native float min(float a, float b);
public static native float max(float a, float b);
public static native float floor(float value);
public static native float ceil(float value);
public static native float sin(float angle);
public static native float cos(float angle);
public static native float sqrt(float value);
public static native float atan2(float y, float x);
public native float abs(float real, float imag);
public static native float arg(float real, float imag);
public static native float real(float abs, float arg);
public static native float imag(float abs, float arg);
public static native float random(float min, float max);
public static native float princarg(float phase);
public static native short mean(short[] buffer, int offset, int length);
public static native float rms(short[] buffer, int offset, int length);
public static native float rms(short[] buffer, int offset, int length, short mean);
public static native float rms2dbfs(float value, float min, float max);
}
android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Name of the library without prefix "lib" and file extension
LOCAL_MODULE := Voicesmith
# Optimization flags (see KissFFT makefile)
LOCAL_ARM_MODE := arm
LOCAL_CFLAGS := -Wall -O3 -ffast-math -funroll-loops -fomit-frame-pointer
# LogCat support
# LOCAL_LDLIBS := -llog
# Debugging flag
# LOCAL_CFLAGS += -g
# Include all .c/.cpp files to build
LOCAL_SRC_FILES := $(shell cd $(LOCAL_PATH); \
find . -type f -name '*.c'; \
find . -type f -name '*.cpp')
include $(BUILD_SHARED_LIBRARY)
Upvotes: 0
Views: 5212
Reputation: 6461
your native method abs
is missing static
in its declaration. Your build should have caught the error, Android Studio does..
Try changing it to
public static native float abs(float real, float imag);
Some other suggestions:
name Math.h
can conflict with standard math.h
on native side (wont even compile if you try on windows, as windows file system is case insensitive ... i had to change your Math.h to Math2.h).
Even on java side, there is already Math
class at java.lang.Math
with similar functions (eg: java.lang.Math.abs
), can potentially autocomplete with java.lang.Math.abs
particularly for your code snippet above as it misses static
in declaration (``java.lang.Math.abs` is static IDE matches to it)
Upvotes: 1