命令: javah -jni JavaHowTo 结果: error: cannot access JavaHowTo class file for JavaHowTo not found javadoc: error – Class JavaHowTo not found. Error: No classes were specified on the command line. Try -help. 我已经正确设置了类path,但仍然得到这个javah错误。 任何解决scheme将是非常有用的。
我想要一个一致的和简单的方法来在JNI代码中抛出exception; 处理链式exception的东西(隐式地从env-> ExceptionOccurred方法中,或者通过参数显式的,无论哪种方式都是好的),并且每当我想要这样做的时候,我都省去了查找构造器。 以上所有都是用C语言编写的,尽pipe我可以根据需要从C ++翻译它。 有没有人有这样的东西,他们可以分享?
在你的Android JNI应用程序中有上述错误? 继续阅读… 在前面,我会说我已经用我自己的方式解决了这个问题,但是我感觉Android构build系统中的某些东西(可能是关于Eclipse)已经崩溃了,我希望能够节省一些时间。 也许其他人已经遇到了这个问题,并可以评论什么对他们有效。 有一段时间,我有一个Android项目,有一些使用NDK开发的JNI代码。 然后,今天,我改变了Java代码中的东西,然后poof,我不能再加载我的JNI库。 它失败了,例如: E / AndroidRuntime(999):java.lang.UnsatisfiedLinkError:无法加载mylibrary:findLibrary返回null 我Googlesearch并尝试了一切(重build,closures和重新启动Eclipse等等) 什么最终解决了我的问题? 在尝试另一次运行之前,我从设备上物理卸载了我的应用程序。 而已。 之后,它的工作。 什么对你有用?
我无法在R 3.0调用rJava包。 我收到以下消息 Error: package 'rJava' was built before R 3.0.0: please re-install it 当我尝试重新安装rJava软件包时出现错误。 我已经提供了R CMD javareconf的输出 Java interpreter : /usr/bin/java Java version : 1.7.0_21 Java home path : /usr/lib/jvm/java-7-openjdk-i386/jre Java compiler : /usr/lib/jvm/java-7-openjdk-i386/jre/../bin/javac Java headers gen.: /usr/lib/jvm/java-7-openjdk-i386/jre/../bin/javah Java archive tool: /usr/lib/jvm/java-7-openjdk-i386/jre/../bin/jar trying to compile and link a JNI progam detected JNI cpp flags […]
我有一些用于Android的C代码,可以处理大量的低级别数字。 我想知道我应该使用什么设置(例如,我的Android.mk和Application.mk)文件,以便生成的代码可以在所有当前Android设备上运行,但也可以利用特定芯片组的优化。 我正在寻找良好的默认Android.mk和Application.mk设置来使用,并且我想避免使用#ifdef分支乱丢我的C代码。 例如,我知道ARMv7具有浮点指令,一些ARMv7芯片支持NEON指令,默认的ARM不支持这两种指令。 是否可以设置标志,以便我可以用NEON构buildARMv7,没有NEON的ARMv7和默认的ARM构build? 我知道如何做后两个,但不是全部3.我对使用什么设置谨慎,因为我认为当前的默认设置是最安全的设置,其他选项有什么风险。 对于GCC特定的优化,我使用以下标志: LOCAL_CFLAGS=-ffast-math -O3 -funroll-loops 我已经检查了所有这三个加速我的代码。 还有其他常见的我可以添加吗? 我的另一个build议是在Android.mk上添加“LOCAL_ARM_MODE:= arm”,以加快新的arm芯片的速度(尽pipe我很困惑这是什么以及旧芯片会发生什么)。
在java中,Object类的私有静态方法registerNatives()是做什么的?
我有一些C函数,我通过JNI调用一个指向结构的指针,还有一些函数会分配/释放一个指向相同types结构的指针,以便处理我的包装器。 令人惊讶的是,JNI文档对如何处理C结构几乎没有提及。 我的C头文件看起来像这样: typedef struct _MyStruct { float member; } MyStruct; MyStruct* createNewMyStruct(); void processData(int *data, int numObjects, MyStruct *arguments); 相应的JNI C包装文件包含: JNIEXPORT jobject JNICALL Java_com_myorg_MyJavaClass_createNewMyStruct(JNIEnv *env, jobject this) { return createNewMyStruct(); } JNIEXPORT void JNICALL Java_com_myorg_MyJavaClass_processData(JNIEnv *env, jobject this, jintArray data, jint numObjects, jobject arguments) { int *actualData = (*env)->GetIntArrayElements(env, data, NULL); processData(actualData, numObjects, […]
我正在寻找一种方法来使用Eclipse轻松debuggingAndroid NDK应用程序中的C代码。 我已经阅读了使用gdb或类似的东西来debugging应用程序的方法,但是我想要的是以某种方式将消息推送到Eclipse的方法。 我正在寻找一个解决scheme,就像在C中使用打印函数一样简单,并在DDMS日志或类似的东西中看到它。 有没有人有这样的经验?
简介:当从本地创build的线程上的本机代码调用回Java时,我看到Java线程泄漏。 (更新2014年2月11日:我们提出了这个问题作为Oracle的支持请求,现在已经被Oracle 确认在Java 7更新45上。它只影响64位Linux(也可能是Mac)平台:32位Linux不受影响) 。 (2014年4月29日更新:甲骨文已经解决了这个问题,并将在Java 7更新80中发布)。 我有一个由Java层和本地库组成的应用程序。 Java层通过JNI调用本地库:然后这会导致一个新的本地线程开始运行,这将调用回Java。 因为新的本地线程没有连接到JVM,所以在进行callback之前需要先连接,然后再分离。 通常的做法似乎是用AttachCurrentThread / DetachCurrentThread调用来callbackJava的代码。 这个工作正常,但是对于我们的应用程序(这个应用程序非常频繁地调用Java),每次附加和分离的开销都很大。 在几个地方(像这里和这里 )描述的优化build议使用基于线程本地存储的机制来消除这个问题:基本上每次触发本地callback时,testing线程是否已经连接到JVM:如果没有,则将其附加到JVM,并使用线程本地存储机制在线程退出时自动分离该线程。 我已经实现了这一点,但是虽然附件和分离似乎正确地发生,这导致在Java端的线程泄漏。 我相信我正在做的一切正在努力,看看可能是错的。 有一段时间我一直在抨击我的头脑,我会非常感激任何见解。 我用缩减的forms重新创build了这个问题。 以下是本地图层的代码。 我们这里有一个封装器,它封装了返回当前线程的JNIEnv指针的过程,使用POSIX线程本地存储机制自动分离线程,如果它尚未连接。 有一个callback类用作Javacallback方法的代理。 (为了消除创build和删除与Java对象相关的全局对象引用的额外复杂性,我已经使用了对静态Java方法的callback,这与这个问题无关)。 最后有一个JNI方法,当被调用时,构造一个callback,并创build一个新的本地线程,并等待它完成。 这个新创build的线程调用一次callback然后退出。 #include <jni.h> #include <iostream> #include <pthread.h> using namespace std; /// Class to automatically handle getting thread-specific JNIEnv instance, /// and detaching it when no longer required class JEnvWrapper { […]
由Rob Gordon编写的“Essential JNI:Java本地接口”一书包含下面的代码示例,用于将jstring转换为Cstring: const char* utf_string; jboolean isCopy; utf_string = env->GetStringUTFChars(str, &isCopy); /* … use string … */ if (isCopy == JNI_TRUE) { env->ReleaseStringUTFChars(str, utf_string); } 请注意,如果isCopy为true,则只调用ReleaseStringUTFChars 。 但是“ Java本地接口:程序员指南和规范” (替代链接: http://192.9.162.55/docs/books/jni/html/objtypes.html#5161 : http://192.9.162.55/docs/books/jni/html/objtypes.html#5161 )说: 无论GetStringChars是否将* isCopy设置为JNI_TRUE或JNI_FALSE,ReleaseString-Chars调用都是必需的。 ReleaseStringChars会释放副本或取消实例,具体取决于GetStringChars是否已经返回副本。 我正确地认为这是Gordon书中的一个错误?