Articles of jni

如何在GetMethodID方法签名参数中指定类的数组?

如何在GetMethodID函数签名参数中指定我获取的函数id是否接受自定义类的数组? 我在java中有一个带签名的函数: void getData( ListDataClass[] arryData ) 我想使用GetMethodID函数从JNI接口获取此函数的方法id。 为此,我在函数签名参数中提到如下: “([myPackeg/ListDataClass)V” 但这不起作用,我得到exception,因为Method Not Found 。 如果我指定字符串类的数组,同样的事情。

在Activity中调用本地方法的第三方库两次会导致Android应用程序关闭

我在我的应用程序中集成了两个本机库(.so)。 库编译得很好,我也可以在我的应用程序中加载它们。 我第一次调用库的本机方法时工作正常,但如果我在Activity中再次调用相同的方法,应用程序将关闭。 我面临的问题与此处提到的完全相同: http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call 有效的解决方案是在另一个Activity中调用本机方法,并通过System.exit(0)强制关闭它。 在文章之后,我尝试在成功操作后将指针设置为NULL,但这对我没有帮助。 一旦由System.loadLibrary()加载库,也无法卸载库。 我想在不创建新Activity的情况下多次调用本机方法。 任何想法如何解决这个问题? (我最终find了一个解决方案……就在这里) 好的,我终于find了解决这个问题的方法。 解决方案实际上非常简单。 构建另一个独立的本机库(实用程序库)来加载和卸载其他库。 我们需要做的是在实用程序的本机方法中使用dlopen()和dlclose()。 我们可以通过System.loadLibrary()像以前一样加载实用程序库。 因此,在实用程序库的本机方法中,我们需要做的是: 使用#include //这是调用dlopen()和dlclose()函数所必需的。 提供处理程序和函数原型: void *handle; typedef int (*func)(int); // define function prototype func myFunctionName; // some name for the function 通过dlopen()打开库: handle = dlopen(“/data/data/my.package.com/lib/somelibrary.so”, RTLD_LAZY); 获取并调用库的function: myFunctionName = (func)dlsym(handle, “actualFunctionNameInLibrary”); myFunctionName(1); // passing parameters if needed in the […]

如何构建共享库并在其他ndk程序中调用它

我想构建一个共享库。 要构建它,我需要调用另一个共享库。 这是我做的: 1.创建一个名为“BuildLib”的Android项目,并在项目目录下添加一个新文件夹“jni”。 jni文件夹的内容: JNI – > Android.mk – > Application.mk – > add.cpp – > add.h add.cpp只做两个数字加法: add.h: int add(int a,int b); add.cpp: #include “add.h” int add(int a,int b){ return a+b;} Android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := add.cpp LOCAL_MODULE := add include $(BUILD_SHARED_LIBRARY) 构建项目后,我在目录$(BUILDLIB)/libs/armeabi/下获得了libadd.so。 创建另一个名为“CallLib”的Android项目。 将libadd.so和libadd.so复制到jni文件夹,创建Android.mk , Application.mk和call_add.cpp 。 Android.mk: […]

Android(ART)崩溃,错误JNI DETECTED ERROR IN APPLICATION:jarray是无效的堆栈间接引用表或无效的引用

我正在编写一个处理原生C(NDK r10d)图片的Android应用程序。 该代码运行良好,直到最近的ART介绍对JNI更严格。 所以代码与Dalvik一起工作正常(例如在Lolipop之前的设备上),但ii在最新的手机上创建了一个SIGENV。 我现在得到错误: 04-26 16:18:34.169: E/art(21443): 0xb4a2dd00 SpaceTypeMallocSpace begin=0x12c00000,end=0x12e01000,limit=0x32c00000,size=2MB,capacity=192MB,non_growth_limit_capacity=512MB,name=”main rosalloc space”] 04-26 16:18:34.170: E/art(21443): 0xb4ae5640 allocspace main rosalloc space live-bitmap 3[begin=0x12c00000,end=0x32c00000] 04-26 16:18:34.170: E/art(21443): 0xb4ae5660 allocspace main rosalloc space mark-bitmap 3[begin=0x12c00000,end=0x32c00000] 04-26 16:18:34.170: E/art(21443): 0xb4874120 SpaceTypeImageSpace begin=0x6f5ab000,end=0x6ff21e58,size=9MB,name=”/data/dalvik-cache/arm/system@framework@boot.art”] 04-26 16:18:34.170: E/art(21443): 0xb4875220 imagespace /data/dalvik-cache/arm/system@framework@boot.art live-bitmap 0[begin=0x6f5ab000,end=0x6ff21f00] 04-26 16:18:34.170: E/art(21443): 0xb4875220 imagespace /data/dalvik-cache/arm/system@framework@boot.art live-bitmap 0[begin=0x6f5ab000,end=0x6ff21f00] […]

简单的任务会出现错误的价值

private static void convert(int x) { // assume we’ve passed in x=640. final int y = (x + 64 + 127) & (~127); // as expected, y = 768 final int c = y; // c is now 320?! } 为什么上面的代码会产生上述值,是否有任何理智的解释? 从JNI调用此方法。 传入的x最初是一个C ++ inttypes,它是一个像这样的jint static_cast(x); : static_cast(x); 在调试器中,在y赋值上设置断点,我看到x = 640。 踩一行,我看到y = 768。 步进另一条线,c […]

无法在WallpaperService中从Java传递的本机代码中访问AAssetManager

我正在尝试从自定义WallpaperService访问本机代码中的资产。 本机代码编译并工作但尝试从传递给本机函数的AssetManager对象获取AAssetManager引用始终返回NULL。 是否与我使用服务而不是导致AAssetManager引用为NULL的Activity这一事实有关? 在Java源代码中,传递给本机函数的AssetManager是有效的,不是null。 为了测试这个,我在提供的示例和目标API级别10中使用了CubeLiveWallpaper演示。以下是为了访问本机function而添加到CubeWallpaper1类的相关代码: static { System.loadLibrary(“renderer”); } private static native void load(AssetManager mgr); @Override public void onCreate() { super.onCreate(); AssetManager mgr = getResources().getAssets(); load(mgr); } 这是我用来尝试获取有效AAssetManager引用的JNI代码: #include #include #include #include #define TAG “CubeWallpaper1.c” void Java_com_example_android_livecubes_cube1_CubeWallpaper1_load(JNIEnv *env, jobject assetManager) { AAssetManager *mgr = AAssetManager_fromJava(env, assetManager); if (mgr == NULL) { __android_log_print(ANDROID_LOG_ERROR, “CubeWallpaper1.c”, “error loading […]

如何调试SEGV_ACCERR

我有一个使用Kickflip和ButterflyTV libRTMP传输video的应用程序 现在有99%的时间应用程序正常工作,但有时我得到一个我无法调试的本机分段错误,因为消息太神秘了: 01-24 10:52:25.576 199-199/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 01-24 10:52:25.576 199-199/? A/DEBUG: Build fingerprint: ‘google/hammerhead/hammerhead:6.0.1/M4B30Z/3437181:user/release-keys’ 01-24 10:52:25.576 199-199/? A/DEBUG: Revision: ’11’ 01-24 10:52:25.576 199-199/? A/DEBUG: ABI: ‘arm’ 01-24 10:52:25.576 199-199/? A/DEBUG: pid: 14302, tid: 14382, name: MuxerThread >>> tv.myapp.broadcast.dev <<< […]

Android NDK,没有规则制定目标

我在其他地方看过这个问题,但答案似乎并不适用于我的情况。 我有一个.cpp文件(不是.c文件)。 我收到了错误: make: *没有规则来制作目标jni/native.c’, needed by obj / local / armeabi / objs / native / native.o’需要。 停止。 Cirapi_android C / C ++问题 这是我的Android.mk文件(非常简单): LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS:=-llog LOCAL_MODULE:=native LOCAL_SRC_FILES:=native.cpp include $(BUILD_SHARED_LIBRARY) 我已经删除了解决其他问题的所有额外空间。 它抱怨native.c,我甚至没有列在我的makefile中。 有任何想法吗? 我在MacOSX Snow Leopard,Eclipse Juno,NDK r8上

JNI错误:本地引用表溢出512个条目

我的function如下所示。 它被执行了很多次。在某些时候它崩溃在jobject nvarObject = env-> GetObjectField(var1,nvar1)给出错误JNI错误:本地引用表溢出512个条目。 任何人都可以调查这个问题并提出一些建议。

从C ++创建android.graphics.Bitmap

我有一些基于NDK的C ++代码需要构建一个android位图对象。 我确信有一种方法可以直接从C ++代码执行此操作,但这不是最简单的事情;) 所以我想调用的方法是 Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 ); 所以要从本机代码执行此操作,我需要执行以下步骤。 find类(android.graphics.Bitmap)。 获取“createBitmap”的静态方法ID。 创建枚举。 调用静态方法。 (最终我需要创建一个jintArray并传入数据,但我稍后会担心)。 我在第2步和第3步很失落。 我的代码目前看起来像这样: jclass jBitmapClass = gpEnv->FindClass( “android.graphics.Bitmap” ); jmethodID jBitmapCreater = gpEnv->GetStaticMethodID( jBitmapClass, “createBitmap”, “(IILandroid/graphics/Bitmap/Config;)Landroid/graphics/Bitmap;” ); 但后来我被卡住了。 如何从本机C / C ++代码创建枚举? 另外我的GetStaticMethodID的最后一个参数是否正确? 我不知道如何指定具体的对象,但我认为上述工作。 但是,枚举可能是错误的! 提前致谢。