- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
--编辑--由于模棱两可的 build.gradle...
./src/main/jniLibs/armeabi-v7a/libaudioboo-native.so
rob@ app$ rm ./src/main/libs/armeabi-v7a/libaudioboo-native.so
rob@ app$ rm ./src/main/obj/local/armeabi-v7a/libaudioboo-native.so
rob@ app$ rm ./src/main/jniLibs/armeabi-v7a/libaudioboo-native.so
已解决的问题 - 将构建更改为以下内容以仅使用 ./src/main/libs 中的共享库
sourceSets {
main {
jni.srcDirs = [] /*disable automatic ndk-build call */
jniLibs.srcDir 'src/main/libs'
}
}
在 android5 上坏了,所以我通过为 Android-studio (1.0) ndk 构建调整它来使用它。正如答案@holo 所指出的,我扫描了所有“findClass”的代码。注意 - 将第 34 行的字符串常量从
更改为 "fm.audioboo.jni.FLACStreamEncoder"; to "fm/audioboo/jni/FLACStreamEncoder";
那并没有解决任何问题。
Java 代码调用一个函数,在该 native 函数执行之前,看起来艺术框架本身正在调用 FindClass(_JNIEnv*, char const*) 在第二个参数中使用错误的字符分隔符。如果您查看 pastebin 链接的第 46-48 行,它看起来不像是曾经调用过 native 函数。该框架只是抛出 bad package name Findclass 错误。请注意, native 函数的第一行是运行时未到达的日志语句。
Java 层...
public FLACStreamEncoder(String outfile, int sample_rate, int channels,
int bits_per_sample)
{
init(outfile, sample_rate, channels, bits_per_sample);
}
...
native private void init(String outfile, int sample_rate, int channels,
int bits_per_sample);
...
static {
System.loadLibrary("audioboo-native");
}
CPP 层 ... 该函数永远不会到达第一行日志 stmt。
extern "C" {
void
Java_fm_audioboo_jni_FLACStreamEncoder_init(JNIEnv * env, jobject obj,
jstring outfile, jint sample_rate, jint channels, jint bits_per_sample)
{
aj::log(ANDROID_LOG_DEBUG, LTAG, "Begin INIT extern call");
assert(sizeof(jlong) >= sizeof(FLACStreamEncoder *));
FLACStreamEncoder * encoder = new FLACStreamEncoder(
aj::convert_jstring_path(env, outfile), sample_rate, channels,
bits_per_sample);
char const * const error = encoder->init();
if (NULL != error) {
delete encoder;
aj::throwByName(env, IllegalArgumentException_classname, error);
return;
}
set_encoder(env, obj, encoder);
}
一切正常(jni 构建/android buid/android-java 调用 cpp)直到使用 ndk 10-C 构建 android 5
android5/ART 的新功能似乎是“check_jni.cc”和某种给出错误的严格模式:
D/FLACRecorder(26743): Setting up encoder /data/data/com.borneo.speech/files/20141123081747.flac rate: 22050 channels: 1 format 16
F/art (26743): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: illegal class name 'fm.audioboo.jni.FLACStreamEncoder'
F/art (26743): art/runtime/check_jni.cc:65] (should be of the form 'package/Class', [Lpackage/Class;' or '[[B')
F/art (26743): art/runtime/check_jni.cc:65] in call to FindClass
F/art (26743): art/runtime/check_jni.cc:65] from void fm.audioboo.jni.FLACStreamEncoder.init(java.lang.String, int, int, int)
F
full stacktrace:注意第 46 - 48 行
查看日志,就好像框架正在使用 CPP 中的第二个“thisClazz”arg 对“findClass”进行自己的调用:
Java_fm_audioboo_jni_FLACStreamEncoder_init(JNIEnv * env, jobject obj, ...
它是一个错误的 arg 值,违反了艺术运行时检查。
但我没有运行“javah”来从 java 接口(interface)创建任何 header ,因为这一切都在我获得 git 项目之前完成。
我被难住了。 native 似乎到达了函数,从未到达函数的第一行(log statemt),在
上立即失败 /system/lib/libart.so (art::CheckJNI::FindClass(_JNIEnv*, char const*)+66
ndk(R10C)链接cpp类如下:
make: Entering directory `/home/rob/tmp/audioboo-android/app/src/main/jni'
[armeabi-v7a] Compile thumb : audioboo-ogg <= bitwise.c
[armeabi-v7a] Compile thumb : audioboo-ogg <= framing.c
[armeabi-v7a] StaticLibrary : libaudioboo-ogg.a
[armeabi-v7a] Compile thumb : audioboo-flac <= bitmath.c
[armeabi-v7a] Compile thumb : audioboo-flac <= bitreader.c
[armeabi-v7a] Compile thumb : audioboo-flac <= cpu.c
[armeabi-v7a] Compile thumb : audioboo-flac <= crc.c
[armeabi-v7a] Compile thumb : audioboo-flac <= fixed.c
[armeabi-v7a] Compile thumb : audioboo-flac <= float.c
[armeabi-v7a] Compile thumb : audioboo-flac <= format.c
[armeabi-v7a] Compile thumb : audioboo-flac <= lpc.c
[armeabi-v7a] Compile thumb : audioboo-flac <= md5.c
[armeabi-v7a] Compile thumb : audioboo-flac <= memory.c
[armeabi-v7a] Compile thumb : audioboo-flac <= metadata_iterators.c
[armeabi-v7a] Compile thumb : audioboo-flac <= metadata_object.c
[armeabi-v7a] Compile thumb : audioboo-flac <= ogg_decoder_aspect.c
[armeabi-v7a] Compile thumb : audioboo-flac <= ogg_encoder_aspect.c
[armeabi-v7a] Compile thumb : audioboo-flac <= ogg_helper.c
[armeabi-v7a] Compile thumb : audioboo-flac <= ogg_mapping.c
[armeabi-v7a] Compile thumb : audioboo-flac <= stream_decoder.c
[armeabi-v7a] Compile thumb : audioboo-flac <= stream_encoder.c
[armeabi-v7a] Compile thumb : audioboo-flac <= stream_encoder_framing.c
[armeabi-v7a] Compile thumb : audioboo-flac <= window.c
[armeabi-v7a] Compile thumb : audioboo-flac <= bitwriter.c
[armeabi-v7a] StaticLibrary : libaudioboo-flac.a
[armeabi-v7a] Compile++ thumb: audioboo-native <= FLACStreamEncoder.cpp
[armeabi-v7a] Compile++ thumb: audioboo-native <= FLACStreamDecoder.cpp
[armeabi-v7a] Compile++ thumb: audioboo-native <= util.cpp
[armeabi-v7a] StaticLibrary : libstdc++.a
[armeabi-v7a] SharedLibrary : libaudioboo-native.so
[armeabi-v7a] Install : libaudioboo-native.so => libs/armeabi-v7a/libaudioboo-native.so
make: Leaving directory `/home/rob/tmp/audioboo-android/app/src/main/jni'
Android 在 NP 之上加载库 audioboo-native 然后抛出
JNI DETECTED ERROR IN APPLICATION: illegal class name 'fm.audioboo.jni.FLACStreamEncoder''
关于从 Java 调用 native 函数,我不知道为什么?
最佳答案
我在升级到 Android 5 时遇到了同样的问题,并且刚刚解决了它。
错误存在于您的 native 代码中,而不存在于您的 Java 代码中。在您的 native 代码中的某处,您有一个函数,该函数通过 jni 作为 jobject 传递一个 FlacStreamEncoder 对象,您可以使用如下行检索它:
jclass streamEncoder = env->FindClass("fm.audioboo.jni.FLACStreamEncoder");
但是 JNI 应该使用“/”作为分隔符而不是“.”,所以这一行应该是:
jclass streamEncoder = env->FindClass("fm/audioboo/jni/FLACStreamEncoder");
相反。以前的 android 版本默默地忽略了这个问题,但现在它却在你面前炸开了锅。
来自 https://android.googlesource.com/platform/art/+/kitkat-dev/runtime/check_jni.cc
// Checks that 'class_name' is a valid "fully-qualified" JNI class name, like "java/lang/Thread" // or "[Ljava/lang/Object;". A ClassLoader can actually normalize class names a couple of // times, so using "java.lang.Thread" instead of "java/lang/Thread" might work in some // circumstances, but this is incorrect void CheckClassName(const char* class_name) { if (!IsValidJniClassName(class_name)) { JniAbortF(function_name_, "illegal class name '%s'\n" " (should be of the form 'package/Class', [Lpackage/Class;' or '[[B')", class_name); } } }
关于android-ndk - android art runtime check_jni.cc 包名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27092044/
我试图找到使用这行代码的原因 var cc = cc = cc || {}; 在 Cocos2D JavaScript 库中,例如 this地方,但我找不到任何合理的理由。就设置默认值而言,单一赋值是
我的 make 文件中有这些行: ifeq ($(SYSTEM),SOLARIS) # SUN Solaris 8 no c99 ifeq ($(OSVER),510)
服务器详细信息 MySQL 5.6.22 256GB 内存 4TB 固态硬盘 32 核 背景信息 有一个删除进程,每秒大约执行 3 次删除。每秒 2-3k QPS。主要是 SELECT。没有长时间运行
我正在 Spring 的帮助下发送邮件,其中我想要 CC 中的多个电子邮件 ID,所有人都会收到邮件,但问题是当他们在rackspace(apps.rackspace.com)中打开电子邮件时,它只显
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有一个生成文件。当我在 Unix 上运行它时,我得到这个错误: cc -I/opt/oracle/product/9.2.0/rdbms/demo -I/opt/oracle/product/9.2
直观的逻辑,具有 build 性,是函数式编程中类型系统的基础。经典逻辑不是 build 性的,尤其是排中律 A ∨ ¬A(或其等价物,例如 double negation elimination 或
我必须使用我之前创建的列表文件在 C++ 中编写一个队列,并且我很难编译所有内容。 我目前遇到的问题是,当我编译时出现错误: Queue.h:7:2: 错误:'List' 没有命名类型 如何正确连接队
使用支持延续的语言,例如Scheme、Ruby 和 Haskell,假设有一个函数 cc' 不带参数并返回当前延续,以便通过调用 cc' 获得延续的调用者然后可以随心所欲地在任何地方调用延续。 cc'
我有一个 InDesign 文档,其中包含不同宽度尺寸的页面。现在我想用 JS 脚本添加垂直指南。因此我必须添加 pageWidth + pageWidth (特定页面的)。 但我只知道如何获取文档尺
像这样,我有一个对象: { 'person': { 'like': { 'color': 'red', 'food': 'rice' }, 'nam
我知道我可以用: string input = "AA,BB,CC"; string output = ""; foreach (var item in
我正在尝试使用我使用 Label-img 标记的样本来训练对象检测算法。我的图像尺寸为 1100 x 1100 像素。我使用的算法是在 TensorFlow 2 Detection Model Zoo
我正在尝试学习 C,并且刚刚开始阅读“艰难地学习 C”这本书。在第二课中,作者提到了 Makefiles,并指出当使用命令“make example.c”时,“make”会自动调用 cc 来构建 .c
在我的主要方法的一开始,我就有了 main(int argc, char *argv[]){ if(argc!=2){ printf("not enough arguments"); ex
因此,我有一个 c 模块,其中我修改了两件事:向函数添加了一个参数,向结构体添加了一个参数。 问题是,当使用 cc 进行编译时(从我继承的脚本),无论我的更改在哪里,我都会收到错误消息(抱歉,如果翻译
我浪费了很多时间来弄清楚为什么一种算法应该比另一种算法更有效,然而,就速度而言,另一种算法却完全相同。我做了这些操作:我在一个单独的终端窗口中编译了第一个源代码;而第二个源代码在另一个窗口中。我只是用
多次按 Tab 不会将文本向右移动。有没有办法让它表现得像 Visual Studio 的智能缩进?第一个制表符缩进,随后的制表符将文本移动到下一个制表位。谢谢你。 最佳答案 像这样的东西? (def
如果我使用 C 编译器 cc,则命令行完成不起作用。如果我输入 cc dig + press tab 那么什么都不会发生,但是如果我用 cc digenv.c 编译程序,那么它就可以工作。为什么 cc
有人对它的工作原理有很好的指导吗?带有视觉辅助的东西会很好,我遇到的每个指南似乎都在说我需要重新尝试的同一件事。 最佳答案 这是留在CS实验室白板上的图。因此,您将要获取一些苹果,然后在开始操作之前先
我是一名优秀的程序员,十分优秀!