Tag: jni

Swig:将Java中的字节数组传递给C语言

我正在尝试使用Swig创建用于将byte []传递给C的Java实现。 痛饮: %include “typemaps.i” %apply(char *STRING, int LENGTH) { (char *buff, int len) }; %inline { typedef struct { char* buff; int len; } workit_t; } 在我生成的java类(workit_t.java)中,参数buff是String,而不是byte []。 Java的: public void setBuff(String value){ … } 我的swig定义中我做错了什么? 当我编写一个没有结构的简单swig定义时,我得到了所需的参数类型。 痛饮: %include “typemaps.i” %apply(char *STRING, int LENGTH) { (char *buff1, int *len1) }; Java的: public static void […]

JNI Pass Char * 2Darrays到JAVA代码

我想通过C代码中的JNI层传递以下指针数组 char *result[MAXTEST][MAXRESPONSE] = { { “12”, “12”, “” }, { “8”, “3”, “” }, { “29”, “70”, “” }, { “5”, “2”, “” }, { “42”, “42”, “” } }; 在java代码中,我写了以下声明 public static native String[][] getResult(); 我很困惑如何将该数组通过JNI层传递给Java代码??? 以下是JNI层描述 JNIEXPORT jobjectArray JNICALL Java_com_example_CheckResult_getResult (JNIEnv *env, jclass thiz) { Confused over here ???? }

使用JNI将C数组复制到Java数组中

我在C中有一个无符号整数数组和一个long数组java数组。 我想将无符号整数的内容复制到java数组中。 到目前为止,我发现执行此操作的唯一函数是SetLongArrayRegion(),但这需要一个完整的缓冲区数组。 是否有一个函数只设置java数组的各个元素?

JNI与JNA表现

我们有一个原生的c/asm应用程序利用GPU(OpenCL)通过特定的方法获得大的encrypt/decrypt数据,它只是工作完美,没问题。 项目的一部分(Web和分发)由JEE开发,我们只需要调用本机应用程序/库。 我们尝试使用Process类将其称为分离外部进程。 问题是我们无法控制应用程序(事件,处理程序,线程等)。 我们还尝试将C代码切换为Java代码,但性能已经消失。 除了将本机代码作为进程运行之外,我正在考虑JNA和JNI,但是有一些问题。 问题: 为了更好(更快)的读/写解决方案,是否可以通过JNI和JNA中的直接(非托管)内存[Java( ByteBuffer#allocateDirect() )]交换数据? 是否可以通过本机代码管理和处理进程,并通过Java代码(OpenCL lib)访问GPU(共享)内存? 性能怎么样? JNA比JNI快吗? 我们在Redhat Linux6 x64上有两个AMD W7000集群设备。

什么可以导致Java本机函数(在C中)在进入时出现段错误?

该项目 我正在使用Java Native Interface将Java命令行界面编写到内部网络和网络测试工具的C库中。 C代码(我没有写)是复杂的低级别,通常在位级操作内存,并且只使用原始套接字。 应用程序是C端的multithreading(后台运行的pthread)以及Java端(ScheduledThreadPoolExecutors运行调用本机代码的线程)。 也就是说,C库应该基本稳定。 事实certificate,Java和JNI接口代码会导致问题。 问题 应用程序在进入本机C函数时崩溃并出现分段错误。 这仅在程序处于特定状态时才会发生(即,成功运行特定本机函数会导致下一次调用另一个特定本机函数进行段错误)。 此外,在发出quit命令时,应用程序会以类似的段错误崩溃,但同样,只有在成功运行相同的特定本机函数之后才会崩溃。 我是一个没有经验的C开发人员和经验丰富的Java开发人员 – 我习惯崩溃,给我一个特定的原因和一个特定的行号。 在这种情况下我需要做的就是hs_err_pid*.log输出和核心转储。 在这个问题的最后,我已经包含了我所能做的。 我的工作到目前为止 当然,我想找到发生崩溃的特定代码行。 我在Java端的本机调用之前放置了一个System.out.println()并且将printf()作为本机函数的第一行,程序崩溃后肯定会直接使用fflush(stdout) 。 System.out调用运行, printf调用没有。 这告诉我,在进入函数时发生了段错误 – 这是我以前从未见过的。 我将参数三重检查到函数,以确保它们不会起作用。 但是,我只传递一个参数(类型为jint )。 另外两个( JNIEnv *env, jobject j_object )是JNI构造,不受我的控制。 我注释掉了函数中的每一行,只留下了return 0; 在末尾。 段错误仍然发生。 这让我相信问题不在这个function中。 我以不同的顺序运行命令(有效地运行本机函数不同的命令)。 只有在崩溃函数调用之前运行一个特定的本机函数时才会发生段错误。 此特定function在运行时似乎表现正常。 我在另一个函数的末尾附近打印了env指针的值和&j_object的值,以确保我没有以某种方式破坏它们。 我不知道我是否损坏了它们,但是在退出函数时它们都具有非零值。 编辑1:通常,相同的函数在许multithreading中运行(通常不是并发的,但它应该是线程安全的)。 我从主线程运行该函数,而没有任何其他线程处于活动状态,以确保Java端的multithreading不会导致问题。 它不是,我得到了同样的段错误。 所有这一切都困扰着我。 如果我注释掉整个函数,除了return语句之外,为什么它仍然是段错误? 如果问题出现在另一个function中,为什么不在那里失败? 如果第一个函数弄乱内存并且第二个函数非法访问损坏的内存是一个问题,为什么不在非法访问的行上失败,而不是进入函数? 如果您看到一篇互联网文章,其中某人解释了与我类似的问题,请对其进行评论。 有很多段错误的文章,似乎都没有包含这个特定的问题。 对于SO问题同样如此。 […]

如何配置Native JNI库

如何配置用C编写的Java Native Interface库? 我知道通常的C分析器,但我的问题是如何分析整个集合,包括调用JVM方法,这可能会减慢程序的速度。

停止/取消执行FFmpeg命令

有FFmpeg Static(二进制)可用于Android,我们可以在执行某些操作时停止/取消一些FFmpeg执行(命令) https://github.com/WritingMinds/ffmpeg-android-java/issues/33 但我想使用FFmpeg共享库和JNI,我找到了下一个库https://github.com/IljaKosynkin/FFmpeg-Development-Kit (它工作正常) 但没有选择停止执行FFmpeg命令(或杀死进程) 我们run那里使用Java本地run方法来开始执行一些命令: Java: https : //github.com/IljaKosynkin/FFmpeg-Development-Kit/blob/master/JNI/app/src/main/java/com/example/ilja/jni/VideoKit.java#L57 然后在C中我们调用FFmpeg的main方法: C: https : //github.com/IljaKosynkin/FFmpeg-Development-Kit/blob/master/JNI/app/jni/videokit.c#L41 在调用Java run和C main方法后,如何停止/取消某些FFmpeg执行?

CvCaptureFromAVI问题 – OpenCV Android

我需要逐帧捕获存储在Android设备的SD卡中的video(在本例中为我的模拟器)。 我通过NDK使用Android和OpenCV。 我通过DDBS(eclipse)的文件浏览器在sdcard中手动推送文件“SinglePerson.avi”,我使用下面的代码来读取文件: JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4Mixed_VideoProcessing(JNIEnv*, jobject) { LOGI(“INSIDE VideoProcessing “); CvCapture* capture = cvCaptureFromAVI(“/mnt/sdcard/SinglePerson.avi”); IplImage* img = 0; if(!cvGrabFrame(capture)){ // capture a frame LOGI(“Inside the if”); printf(“Could not grab a frame\n\7”); exit(0); } img=cvRetrieveFrame(capture);// retrieve the captured frame cvReleaseCapture(&capture); } 问题是cvGrabFrame(捕获)结果总是错误的。 有任何建议正确打开video并抓住帧吗? 提前致谢

Android – 从JNI获取MEID

我正在使用Android,编写一些JNI代码,我正在寻找一种从设备查询移动设备标识符(MEID)的方法。 http://en.wikipedia.org/wiki/Mobile_equipment_identifier 我正在尝试编写可以在Android设备上自行运行的C或C ++代码,所以我认为我不能使用Java(即从TelephonyManager获取MEID)。 搜索StackOverflow发现: 是否有一个android shell或adb命令,我可以使用它来获取设备的IMEI / MEID? 好的, dumpsys iphonesubinfo可以获得我需要的信息。 它的工作原理! 除了作为Android源代码的一部分之外,我找不到dumpsys的源代码。 所以我下载了…我的硬盘在下载完成之前已经填满了,但我确实得到了dumpsys的源代码。 这是一个令人惊讶的短C ++文件。 它只是查询Android的IBinder界面。 所以,我的问题: 0)有没有什么办法可以IBinder使用NDK中的东西来编写对IBinder的查询? dumpsys.cpp使用的包含文件不在NDK中,并且NDK目录中的grep在任何包含文件或代码示例中都找不到IBinder ,所以我的猜测是“不”(但我想错了)。 1)有没有其他好的方法来获得MEID? 我认真考虑我应该只使用system(“dumpsys iphonesubinfo > /tmp/myprogname_dumpsys.tmp”然后打开生成的文件并解析它。这应该可行,但我很难称之为优雅…而且我是不确定每个Android设备上是否有dumpsys可用。 编辑:使用system()运行dumpsys将无法正常工作,因为dumpsys需要android.permission.DUMP和Android不再允许非系统应用程序拥有该权限。 在Java中Dumpsys权限拒绝

更快的Math.exp()通过JNI?

我需要非常频繁地从java计算Math.exp() ,是否有可能让本机版本比java的Math.exp()更快地运行? 我只尝试了jni + C,但它比普通的java慢。