Articles of jni

Android NDK溢出dalvik JNI本地参考表

我有以下问题,从c ++我发送巨大的字符串[]到java。 巨大的=最多20行; 我正在做以下事情 jint jtype = 2; jstring emptyString = env->NewStringUTF(“”); jobjectArray data = (jobjectArray)env->NewObjectArray(7, env->FindClass(“java/lang/String”), emptyString); env->SetObjectArrayElement( data,0,env->NewStringUTF(item->get_id().c_str()); env->SetObjectArrayElement( data,1,env->NewStringUTF(item->get_number().c_str()); env->SetObjectArrayElement( data,2,env->NewStringUTF(item->get_fullname().c_str()); env->SetObjectArrayElement( data,3,env->NewStringUTF(item->get_mf().c_str()); env->SetObjectArrayElement( data,4,env->NewStringUTF(item->get_dob().c_str()); env->CallVoidMethod(dao, jsaveItem, data, jtype); int i; for (i = 0; i GetObjectArrayElement(data, i); env->DeleteLocalRef(string); } env->DeleteLocalRef(emptyString); env->DeleteLocalRef(data); env->DeleteLocalRef(dao); 这是在一个循环中发生的所以我正在为我想要保存在数据库中的每个对象执行它,所以你可以想象,它发生了很多次。 所以我很考虑VM并删除我创建的每个字符串的本地引用,但我仍然得到: ReferenceTable overflow (max=512) Last 10 entries in […]

没有JNI_OnLoad发现跳过init>应用程序关闭

伙计们, 我正在开发一个Android应用程序,我需要第三方.so库。 我根据他们的指示构建了这个第三方库(使用ndk-build),然后将其包含在我的Android项目中。 因此,我按照docs / PREBUILTS.html中描述的步骤操作,并在jni / prebuilt目录中成功构建新的.so。 现在我尝试在一个简单的测试Android应用程序中使用它来利用.so工具。 所以我做的是: static { Log.i(“load so > “,”load so”); System.loadLibrary(“xyz”); } /* The native functions */ private static native int openFile(String filename); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try{ String path = getPathForDownloadDirectoryFile(); Log.i(“file path> “, path); int num= openFile(path); }catch(Exception e){ Log.e(“>”, “could not open […]

在包含下划线的Android包名称中调用JNI函数

我正在尝试使用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); […..] } wrapper.c : […]

Android – 加载库失败

我对这个问题有类似的问题,但略有不同。 我编译了一个.so库来与JNI一起使用。 因为它很大(15 MB),所以我把它放在SDCard而不是标准的应用程序中。 该文件名为libSample.so,位于/data/library/libSample.so 我将它加载到静态初始化块中: try { File sdcard = Environment.getExternalStorageDirectory(); File libraryLoc = new File(sdcard.getAbsolutePath() + “/library/libSample.so”); Log.i(“Library”, “Does the library exist?” + libraryLoc.exists()); System.load(libraryLoc.getAbsolutePath()); } catch (UnsatisfiedLinkError e) { Log.e(“Translator”, e.getMessage()); Log.e(“Translator”, e.toString()); } 这是相关的logcat输出: 09-02 16:42:58.882: DEBUG/dalvikvm(4185): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8 09-02 16:42:58.892: DEBUG/dalvikvm(4185): Added shared lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x434fb6f8 […]

使用FFMPEG和JNI压缩video

我想创建一个Android应用程序,它可以find一个video文件(超过300 MB)并将其压缩到较小的mp4文件。 我已经尝试用这个做了 由于您要压缩小尺寸video(低于100 mb),因此本教程非常有效 所以我尝试使用JNI实现它。 我设法用这个来构建ffmpeg 但目前我想做的是压缩video。 我对JNI知之甚少。 但我尝试使用以下链接了解它 如果有人可以指导我在打开文件之后压缩video的步骤,那么使用非常棒的JNI,谢谢

UnsatisfiedLinkError(未find本机方法)

有一块代码在android 4.1.2上工作正常但在4.0.3上没有,崩溃日志是4.0.3 我收到UnsatisfiedLinkError Exception 请指导我谢谢 02-22 12:57:09.319: D/dalvikvm(1312): Trying to load lib /data/data/com.kosh.android/lib/libsqliteX.so 0x41056f48 02-22 12:57:09.319: D/dalvikvm(1312): Added shared lib /data/data/com.kosh.android/lib/libsqliteX.so 0x41056f48 02-22 12:58:02.060: W/dalvikvm(1312): No implementation found for native Lcom/shabdkosh/android/sqlite/CursorWindow;.native_init (Z)V 02-22 12:58:07.624: D/AndroidRuntime(1312): Shutting down VM 02-22 12:58:07.624: W/dalvikvm(1312): threadid=1: thread exiting with uncaught exception (group=0x409961f8) 02-22 12:58:07.767: E/AndroidRuntime(1312): FATAL EXCEPTION: main 02-22 […]

Android NDK / JNI:构建依赖于其他共享库的共享库

我正在编写一个Android应用程序,希望将JNI调用成为使用NDK构建的共享库。 诀窍是这个共享库调用OTHER共享库提供的函数。 其他共享库是已在其他地方编译的C库。 这是我尝试过的: 我的环境:我在Eclipse工作。 我添加了原生支持并拥有一个jni库。 在那个库中,我有我的代码和\ lib目录,我已经复制了我的其他.so文件。 尝试#1 Android.mk:告诉它libs在哪里 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := native_lib LOCAL_SRC_FILES := native_lib.cpp LOCAL_LDLIBS := -L$(SYSROOT)/../usr/lib -llog LOCAL_LDLIBS += -L$(LOCAL_PATH)/lib/support_lib1 LOCAL_LDLIBS += -L$(LOCAL_PATH)/lib/support_lib2 include $(BUILD_SHARED_LIBRARY) 这构建得很好,但是当我尝试运行时,我得到错误,表明dlopen(libnative_lib)失败,因为它无法加载libsupport_lib1。 来到这里我发现了这个: 共享库可以调用另一个共享库吗? 这说我需要在所有必要的库上调用load库。 大! 尝试#2首先打开每个库 static { System.loadLibrary(“support_lib1”); System.loadLibrary(“support_lib2”); System.loadLibrary(“native_lib”); } 再次,这构建得很好,但是当我运行时,我得到一个新的错误: 无法加载libsupport_lib1。 findLibrary返回null。 现在我们到了某个地方。 它不能将库加载到目标。 尝试#3将.so文件复制到project / libs / […]

如何将系统服务添加到Android Framework

我想添加自己的框架代码,该代码在Android“system_server”中运行(处理所有系统级服务)。 我的服务加载了一个JNI库,它与我添加到内核的驱动程序进行通信。 该服务旨在允许应用程序向其注册侦听器以从驱动程序获取更新。 我发现了一篇非常好的博客文章( http://www.androidenea.com/2009/12/adding-system-server-to-android.html ),解释了如何添加系统服务,但我无法完全开始工作。 首先,post提到应该使用“适当的”Android.mk文件来编写客户端/测试应用程序,但是没有举例说明。 当我尝试构建它时,我遇到构建错误,说它无法find我添加的服务。 有人能举例说明这可能是什么样的吗? 另外,我想在供应商目录(或froyo中的设备目录)中实现此function,而不是在Android开源代码中实现。 博客文章提到适当的地方是供应商目录,但没有举例说明这应该是什么样子。 谁知道? 有关在Android中实施您自己的系统服务的任何其他信息都会有所帮助。 我的具体工作流程是: Android应用程序 – >系统服务 – > JNI(本机)库 – >设备驱动程序

在64位android上使用32位jni库

我尝试在Nexus 9上使用本机库运行应用程序。 应用程序退出并显示错误消息: java.lang.UnsatisfiedLinkError: dlopen failed: “lib_xyz.so” is 32-bit instead of 64-bit 是否有任何已知的解决方法来解决此问题(当然,重新编译库并使apk更大)?

使用JNI复制字节缓冲区

我在Stackoverflow上发现了很多关于将C / JNI端的char数组复制到Java中的byte []之类的教程/问题,但不是相反。 我正在使用一个需要字节数组的本机C库。 我只想从java中的byte []获取数据,最好是C中的unsigned char []。 长话短说:在JNI中从jBytearray复制数据的最佳方法是什么? 有没有办法检测它的大小?