我正在尝试使用LAME库在Android中实现MP3编码,遵循以下指南: Lame MP3 Encoder编译为Android http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on -Android与- JNI
但是我得到了一个java.lang.UnsatisfiedLinkError,我认为可能是因为我的包名包含一个下划线,它将其解释为句号.
看下面我的代码可能是这个问题,我该如何解决这个问题.或者是否有其他原因导致这种情况.在此先感谢您的帮助.
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);
[.....]
}
Run Code Online (Sandbox Code Playgroud)
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) {
[....]
Run Code Online (Sandbox Code Playgroud)
完整日志cat错误:
04-17 20:58:36.009: E/AndroidRuntime(26768): FATAL EXCEPTION: main
04-17 20:58:36.009: …Run Code Online (Sandbox Code Playgroud) 我一直在关注如何使用Android NDK移植LAME库. http://blog.libertadtech.com/2011/02/porting-lame-encoder-to-android-arm.html
每个工作正常,我得到了libmp3lame.so文件.
现在进行第一次测试我想调用简单的函数:
void get_lame_version(char *strbuf, size_t buflen, const char *prefix);
Run Code Online (Sandbox Code Playgroud)
我为LAME库编写了一个包装器:
package de.goddchen.android.youtubeconverter;
public class LameWrapper {
public static native void get_1lame_1version(char[] buf, int len,
char[] prefix);
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
public class MainActivity extends Activity {
static {
System.loadLibrary("mp3lame");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
char[] buffer = new char[100];
LameWrapper.get_1lame_1version(buffer, 100, "".toCharArray());
((TextView) findViewById(R.id.text)).setText(buffer.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
05-05 10:36:11.973: DEBUG/dalvikvm(199): Trying to load lib /data/data/de.goddchen.android.youtubeconverter/lib/libmp3lame.so …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照位于以下位置的教程进行操作
http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on-Android-with-JNI
其中的要点是它允许使用带有JNI的LAME MP3编码器.
我按照教程中提到的每个步骤进行操作.我的项目位于
C:\workspace\
Run Code Online (Sandbox Code Playgroud)
并被称为'LAME_Test'.根据教程中标有Compilation with NDK的部分,我继续编写了一个名为'Android.mk'的makefile,如下所示.
我在64位计算机上运行Windows 7.我安装了Cygwin和NDK,并测试了我的设置是否适用于我正在处理的另一个项目.但是,当我去
/cygdrive/c/workspace/LAME_Test/jni
Run Code Online (Sandbox Code Playgroud)
在Cygwin上发出以下命令
/cygdrive/c/Android/android-ndk-r8b/ndk-build
Run Code Online (Sandbox Code Playgroud)
鉴于NDK位于
C:\Android\android-ndk-r8b
Run Code Online (Sandbox Code Playgroud)
编译吐出一堆像这样的警告
warning: incompatible implicit declaration of built-in function 'memset' [enabled by default]
Run Code Online (Sandbox Code Playgroud)
我在这篇帖子的底部附上了一小段警告(因为警告列表真的很大,可能只是增加了混乱 - 而不是增加价值).
想知道是否有一种灵巧的方法来解决这些警告并得到一个漂亮,干净,编译.
PS:我将补充一点,我能够在上面的链接(LAME4Android)中构建+运行示例项目.这需要编译本机代码.因此,看起来该项目实际上尽管发出了所有警告,但仍然很好.我最初认为它因为警告而被打破了.但是,如果有某种方法来修复警告,那确实会很棒.
Android.mk文件的内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmp3lame
LOCAL_SRC_FILES := \
./libmp3lame/bitstream.c \
./libmp3lame/encoder.c \
./libmp3lame/fft.c \
./libmp3lame/gain_analysis.c \
./libmp3lame/id3tag.c \
./libmp3lame/lame.c \
./libmp3lame/mpglib_interface.c \
./libmp3lame/newmdct.c \
./libmp3lame/presets.c \
./libmp3lame/psymodel.c \
./libmp3lame/quantize.c \
./libmp3lame/quantize_pvt.c \
./libmp3lame/reservoir.c …Run Code Online (Sandbox Code Playgroud) 我是Android NDK的新手.我需要使用NDK将Lame库添加到Android Studio.我开始研究并找到一些有用的链接:
如何将"跛脚"mp3编码器共享对象链接到Android工作室项目
我成功但只建立了"armeabi".我怎样才能构建另一个像:"arm64-v8a","armeabi-v7a","mips","mips64","x86","x86_64"?
先感谢您!