Tag: jni

JNI调用非静态函数段错误

我正在为Android的SDL库做一些工作,但我有一点障碍。 此函数在Java中定义: /** * This method is called by SDL using JNI. * @return an array which may be empty but is never null. */ public static int[] inputGetInputDeviceIds(int sources) { int[] ids = InputDevice.getDeviceIds(); int[] filtered = new int[ids.length]; int used = 0; for (int i = 0; i < ids.length; ++i) { InputDevice […]

Android 4.4和5.0中multithreading加速的效率完全不同

我写了一段C代码来在Android中进行一些图像处理(密集计算)(由NDK编译并由jni.h使用)。 为了加速图像处理,我在C代码中使用了pthread_create和pthread_join函数来利用4个线程同时处理图像。 multithreading加速在Android 4.4手机中是成功的,但在所有Android 5.0手机中都失败了。 假设在单线程环境中image_processing函数的处理时间是1s。 我们利用4个线程来加速image_processing函数,如下所示: void image_processing_multiply_threads() { int i; pthread_t pt[4]; for(i = 0 ; i < 4; i++) { if ( pthread_create(pt + i , NULL, image_processing, (void *)(arg + i)) != 0 ) { return; } } for (i = 0; i < 4; i++) { pthread_join(pt[i], NULL); } } […]

var不会变成全局但仍然是本地的

从下面的代码片段开始,我尝试测试NewGlobalRef并尝试在if块的本地范围内声明它后使clsStr全局。 jstring Java_Package_LocalAndGlobalReference_returnGlobalReference (JNIEnv *env, jobject obj) { if(1) { printf(“In function make global reference\n”); jclass clsStr ; jclass cls = (*env)->FindClass(env,”java/lang/String”); if( cls == NULL) return NULL; // create a global reference of clsStr clsStr = (*env)->NewGlobalRef(env,cls); // Delete the local reference, which is no longer userful (*env)->DeleteLocalRef(env,cls); if(clsStr == NULL) return NULL; } […]

在JNI调用中调用getFilesDir()时出现NullPointerException

我试图通过JNI调用从C库调用Java的getFilesDir(),并且我遇到了一个我不理解的NullPointerException。 这是例外: W/System.err( 1576): java.lang.NullPointerException W/System.err( 1576): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) W/System.err( 1576): at MYService.getFilesDirPath(MYService.java:1150) W/System.err( 1576): at MYService.UtvGetPeristentPath(Native Method) 问题出现在这个函数中: public String getFilesDirPath() { try { return getFilesDir().getPath(); // <— Exception happens here! } catch(Exception e) { e.printStackTrace(); Log.e("DEBUG", "getFilesDirPath set exception", e); return null; } } JNI调用设置了一些由JNI_OnLoad设置的静态变量: static JavaVM *s_jvm = NULL; static jclass cls; […]

如何使用Java中基于信号处理的机制捕获JNI崩溃作为exception

我开发了一个Java工具,它有很多JNI函数,我经常遇到JNI崩溃。 有没有可能避免这些崩溃或抓住这些崩溃作为例外。 我上网冲浪,发现它可以通过信号处理,信号通道,sigaction()等等。但我无法获得可靠的信息来指导我。 请指导我这个。

如何在NDK上使用Android上的C函数

我想在Android应用程序中使用C语言编写的函数。 该function取自此处 。 我已经学会了android NDK的一些基础知识,我可以设法在我的Java源码中使用该函数,但是当我调用它时应用程序冻结,而不是等到android让我杀死应用程序。 JNI签名是这样的: JNIEXPORT void JNICALL Java_pda_lupa_callbacks_MySurfaceCallback_NativeYuv2rgb (JNIEnv *env, jclass clazz, jbyteArray imageIn, jint widthIn, jint heightIn, jobject imageOut, jint widthOut, jint heightOut) { jbyte *cImageIn = (*env)->GetByteArrayElements(env, imageIn, NULL); jbyte *cImageOut = (jbyte*)(*env)->GetDirectBufferAddress(env, imageOut); toRGB565((unsigned short*)cImageIn, widthIn, heightIn, (unsigned int*)cImageOut, widthOut, heightOut); (*env)->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT); } 然后我像这样在Java中加载它: static { System.loadLibrary(“rgb”); […]

将C链接到JNI,独立于JDK版本

我通过JNI在我的C程序中调用Java应用程序。 安装了JDK 1.8后,我的系统上有以下JNI .so库: /usr/java/jdk1.8.0_51/jre/lib/amd64/jli/libjli.so /usr/java/jdk1.8.0_51/jre/lib/amd64/server/libjvm.so 要使ldconfig知道这两个文件,我可以在/usr/lib64/创建指向它们的链接,或者创建一个列出它们的/etc/ld.so.conf.d/java.conf文件。 这允许我按如下方式编译我的C代码: gcc -I$JAVA_HOME/include/ -I$JAVA_HOME/include/linux/ \ -L/usr/java/jdk1.8.0_51/jre/lib/amd64/jli \ -L/usr/java/jdk1.8.0_51/jre/lib/amd64/server/ \ callSomeJava.c -ljvm -ljli 这感觉就像系统黑客而不是开发和部署JNI代码的可靠方式。 JDK并不觉得它以鼓励依赖它们的方式将这些库暴露给操作系统。 我的问题如下: 为什么JDK包含这些库的linker name ( lib.so )而不是real name ( lib.so.NN )? 3.1.1。 共享库名称 我应该从哪里获得所需的库,因此它们已经以可链接的方式安装而没有我的系统黑客攻击? 如何以下列方式编译/部署我的C: 每当我更新我的JDK时,是不是依赖于我手动维护ldconfig ? 允许生成的a.out在没有我的ldconfig hacks的部署环境中找到lib?

使用JNI将字符串从C发送到Java

我正在尝试使用JNI将字符串从C发送到Java。 这是我的C代码: static char* test_encrypt_ecb_verbose(char* plain_text_char, char* key_char, char** ciphertext) { uint8_t i, buf[64], buf2[64]; uint8_t key[16]; // 512bit text uint8_t plain_text[64]; char outstr[64]; memcpy(key,key_char,16) ; memcpy(plain_text, plain_text_char, 64); memset(buf, 0, 64); memset(buf2, 0, 64); // print text to encrypt, key and IV printf(“ECB encrypt verbose:\n\n”); printf(“plain text:\n”); for(i = (uint8_t) 0; i < (uint8_t) […]

c char 到jstring printf适用于int类型但不适用于字符串

我们有供应商提供的api,其结构定义为 typedef struct { char duo_word[8]; } duo_word; 他们向我们发送了这个结构中的数据,然后我们必须通过jni传递给我们的java应用程序。 printf(“Number: : %i\n”, duo_word_inst); 打印正确的int值,例如52932,但是 printf(“Number: : %s\n”, duo_word_inst); 没有打印。 更重要的是,如果我在我的java进程下面使用jni代码接收乱码。 jstring jstrBuf = (*env)->NewStringUTF(env, (char*)(duo_word_inst)); (*env)->SetObjectField(env, *ret_obj, fld_id, jstrBuf); 发送乱码给java例如ÄÎ // I have got some example data captured from VS debugger below. duo_word duo_word_inst = { .duo_word = { ‘º’, ‘\b’, ‘\x1’, ‘\0’, ‘À’, ‘\xe’, […]

C和Java通过Jni

我正在尝试从S调用java代码。此方法调用: cls = (* env) -> FindClass (env, “org / libsdl / app / SDLActivity”); mid = (* env) -> GetStaticMethodID (env, cls, “play”, “([Ljava / lang / String;) V”); (* env) -> CallVoidMethod (env, cls, mid); java方法: public static void play () { track.write (bytes, 0, bytes.length); } 导致此错误: 03-25 18:17:32.313:WARN / dalvikvm(655):JNI警告:exception调用JNI方法03-25 18:17:32.313:WARN […]