Articles of jni

Android JNI什么是C / C ++执行代码的当前工作目录?

在Android中,如果使用NDK创build的C / C ++共享库被调用,并且它加载了一个文件,它的当前工作目录是什么? 谢谢

Androidvideo通过ffmpeg修剪

我已经从这个链接从github下载video修剪代码。 这是第一次完美的工作,但是当我第二次尝试运行它的代码崩溃没有任何exception,然后再次尝试运行它第三次崩溃后,它的工作! 有没有人有这种行为的想法? 我也正在开发一个应用程序,它有一个剪裁video模块。 我真的很感激,如果有人能帮助我。

Android:从NativeActivity使用JNI

我们正在使用NativeActivity类在android上开发一个OpenGL游戏。 到目前为止,一切正常,但现在我们需要访问一些似乎只能从Java获得的function。 还有更多,但第一个我们认为将是有用的访问显示DPI。 如此处所述,Java代码如下所示: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); 这里是不幸的对应C ++代码: // My checking routine. #define JNI_ASSERT(jni, cond) { \ if (!(cond)) {\ std::stringstream ss; \ ss << __FILE__ << ":" << __LINE__; \ throw std::runtime_error(ss.str()); \ } \ if (jni->ExceptionCheck()) { \ std::stringstream ss; \ ss << __FILE__ << ":" << __LINE__; \ […]

应用程序崩溃与本机代码

Crashed: .onlineradioapp| 0 gralloc.rk30board.so 0xb4a2d616 bool art::interpreter::DoCall<false, true>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*) 1 gralloc.rk30board.so 0xb4a315c9 (Missing) 2 gralloc.rk30board.so 0xb48e2465 art::JValue art::interpreter::ExecuteGotoImpl<true, false>(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue) 3 gralloc.rk30board.so 0xb4a1349d artInterpreterToInterpreterBridge 4 gralloc.rk30board.so 0xb4a2d031 bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*) 5 gralloc.rk30board.so 0xb48f2fef art::JValue art::interpreter::ExecuteGotoImpl<false, false>(art::Thread*, art::DexFile::CodeItem const*, art::ShadowFrame&, […]

Android NDK:如何重新启动活动后清理本地代码?

所有, 我知道,默认情况下,当屏幕方向改变,或者滑入或滑出键盘时,活动将被终止并重新启动。 (请参阅Activity在Android上重新启动 )。 我的问题是,从本地代码的angular度来处理这个问题的正确方法是什么? 例如,如果我有一个静态块加载本机库,我的应用程序重新启动,我如何确保在本地的任何内存得到妥善处理? 问题是 当我们旋转设备时,它看起来像一个单独的线程池被创build,旧的永远不会被删除。 这意味着每次有人打开设备,我们就有更多的线程闲置并占用内存 我如何确保这不会发生? 我从JNIExample页面的底部看到一些注释: 未解决的问题和错误即使这个例子是function完整的,还有一些尚未解决的问题仍然存在,到目前为止我还没有弄清楚。 开始活动时出现问题,然后按“后退”button将其隐藏,然后重新开始。 根据我的经验,在这种重新开始的活动中调用本地函数将会失败壮观。 callVoid()简单地与分段错误崩溃,而调用getNewData()和getDataString()会导致JVM中止一个错误,因为它不再满意全局caching对象引用。 即使它们受到NewGlobalRef()的保护,并且活动在原始JVM中运行(活动重新启动并不意味着JVM本身已重新启动),似乎活动重新启动以某种方式使我们caching的对象引用无效。 我没有一个很好的解释为什么会发生,所以如果你有任何想法,请让我知道。 这个解决了吗?

用NDK编译给成功包含的头文件提供了错误

我的app.cpp: #include "app.h" #include <EGL/egl.h> #include <EGL/eglext.h> void Java_com_geek_hello_FilterStack_nativeEglSetFenceAndWait(JNIEnv* env, jobject thiz) { EGLDisplay display = eglGetCurrentDisplay(); // Create a egl fence and wait for egl to return it. // Additional reference on egl fence sync can be found in: // http://www.khronos.org/registry/vg/extensions/KHR/EGL_KHR_fence_sync.txt EGLSyncKHR fence = eglCreateSyncKHR(display, EGL_SYNC_FENCE_KHR, NULL); if (fence == EGL_NO_SYNC_KHR) { return; } […]

用C ++(JNI)从Java对象读取整数字段

我正在尝试从C ++访问Java类中的“int”字段; 其实我也试过其他types的。 我可以调用方法确定。 但不能访问字段。 我得到随机垃圾值,而不是我所期待的。 这是我的Java代码: private class MYView extends View { public MYView(Context context) { super(context); five = 555; } public int five; …. } C ++部分: jobject view = (jobject) Env->CallObjectMethod(Obj, jfindViewById, 3); ClassMYView = Env->GetObjectClass(view); jfieldID f = Env->GetFieldID(ClassMYView, "five", "I"); int i = Env->GetIntField(ClassMYView, f); <– error is here, class […]

究竟是什么原因导致了Android的“暂停”错误?

我目前无法debugging一些依赖本机库的Android代码。 特别是一个本地调用似乎倾向于这种“旋转中止”错误。 它通常performance如下: threadid=2: spin on suspend #2 threadid=48 (pcf=3) 到目前为止,我还没有能够确定这里有什么失败,除了这些消息之后,我的应用程序遇到一个SIGSTKFLT并退出。 每一次,第一个线程是GC,第二个线程是当前执行本地代码的任何线程。 与此消息一起打印的堆栈部分始终在堆栈顶部有一个本地方法。 当Dalvik抱怨这个事情到底发生了什么,我该如何开始debugging原因,以便我能解决这个问题? 编辑 :一个有趣的皱纹 – 原生开发者做了一些改变后,我现在也有时会看到下面的错误: PopFrame missed the break VM aborting Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1) 线程转储在堆栈顶部显示我的本地方法也是非常奇怪,但是线程状态是RUNNABLE ,不是NATIVE – 这怎么可能?

Android的JNI:GetObjectClass崩溃与SIGSEGV(不是一个有效的JNI参考)

我想创build一个新的线程,所以我从我的方法初始化(从Java调用)到我的新线程传递虚拟机。 在线程中,我调用AttachCurrentThread并获取JNIEnv * env。 后来,我尝试在环境中调用GetObjectClass并崩溃。 我相信这是因为该对象可能不会被初始化,但我正试图调用在包含本地方法的类中定义的方法。 我一直在试图遵循http://java.sun.com/docs/books/jni/html/fldmeth.html的第4.2节(开始部分)。 一些非常奇怪的事情:我正在用HTC Dream 2.2进行testing,下面的代码不会崩溃,但是使用运行2.2.2的Motorola Droid,它会一直崩溃! 这是我的代码: C ++ JNIEXPORT void JNICALL Java_com_device_client_HostConnection_initialize (JNIEnv * env, jobject obj, jint port) { JavaVM *vm; jint result = env->GetJavaVM(&vm); if (result < 0) { LOGE("Error using GetJavaVM\n"); exit(-1); } struct javaInfo* data = (struct javaInfo*) malloc(sizeof(struct javaInfo)); data->vm = vm; data->javaObjHost = […]

链接第三方库(libs.a)与NDK

我正在构build一个使用第三方本地库的Android apk,这些库位于静态对象代码库(.a文件)中,我需要编写一个JNI包装来访问Java中的这些函数。 这些库已经使用交叉编译器进行编译,并且本地化为Android。 如何编译链接到.a库文件中的函数的JNI源代码? 这是我的Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS := -llog LOCAL_MODULE := ndk1 LOCAL_SRC_FILES := native.c include $(BUILD_SHARED_LIBRARY) 当我编译时,我只得到编译的native.c文件。