Tag: jni

如何在不崩溃的情况下处理来自jni的AudioTrack调用?

我试图从jni回调写入AudioTrack,我得到一个信号7(SIGBUS),故障地址00000000。 我查看了针对odroid的Wolf3D示例,他们似乎使用android.os.Handler发布一个Runnable,它将在正确的线程上下文中进行更新。 我也试过AttachCurrentThread,但在这种情况下我也失败了。 它可以在从构造函数运行时播放声音,即使我将其包装在一个线程中,然后将其发布到处理程序中。 当我通过jni的回调做“相同”时,它失败了。 我认为我正在制定一些规则,但我无法弄清楚它们是什么。 到目前为止,我还没有在SO上找到答案。 所以我想知道是否有人知道应该怎么做。 编辑:回答如下。 以下代码用于说明问题。 Java的: package com.example.jniaudiotrack; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; import android.os.Bundle; import android.os.Handler; import android.util.Log; public class JniAudioTrackActivity extends Activity { AudioTrack mAudioTrack; byte[] mArr; public static final Handler mHandler = new Handler(); /** Called when the activity is first created. */ @Override […]

Java转换/类加载器问题

以下是问题的简化版本: SomeClass c = (SomeClass) obj.getSomeClassParent() 并非总是如此,有时会触发exception org.somepackage.SomeClass can’t be cast to org.somepackage.SomeClass 这怎么可能 ? 我想它与JAI imageio是本机lib这一事实有关,但是中继怎么会发生这种情况呢? 我可能错过了什么,但是什么? I’m using JAI imageio version 1.1 dcm4che 2.0.21 DICOM lib 这是原始代码 ImageInputStream iis = ImageIO.createImageInputStream(src); Iterator iter = ImageIO.getImageReadersByFormatName(“DICOM”); ImageReader reader = iter.next(); DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam(); 和原来的例外 org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam can’t be cast to org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam exception图像http://img215.imageshack.us/img215/3894/exception.jpg

我可以将原生DLL打包到WAR中吗?

我正在开发一个通过JNI使用本机代码的Web服务。 我可以将这些dll打包进我的战争吗? 我已经厌倦了独立管理它们…… PS我正在使用maven。 PPS我正在使用Tomcat 7.x.

它不会创建Java VM(JNI)

我的简单命令行应用程序: int _tmain(int argc, _TCHAR* argv[]) { JavaVM *jvm; JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString = “-Djava.class.path=.”; //Path to the java source code vm_args.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6 vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = 0; jint ret = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); return 0; } 给我: Error occurred during […]

从Eclipse查看本机代码

我有一个使用本机方法调用的java应用程序。有没有办法在eclipse中查看这段代码? 我可以获取此本机库的源代码,但不知道如何在IDE中链接。 如果有人告诉我如何调试这个本机方法,也会有所帮助。

g ++:如何解开导出的符号

我正在尝试编译一个使用JNI的Java库。 当我启动程序时,我看到一个带有UnsatisfiedLinkError的崩溃,它表示在DLL中找不到特定的方法。 仔细观察后,我发现用于编译和链接的g ++通过在方法名称中添加诸如“@ 8”或“@ 16”之类的后缀来破坏我的方法名称。 有没有人知道正确的编译器选项来禁用名称修改? 提前致谢! 编辑 :我通过Eclipse + CDT插件使用MinGW。

JNI:在路径上找到了库,但是方法不是(java.lang.UnsatisfiedLinkError)

我正在尝试使用JNI并获取java.lang.UnsatisfiedLinkError。 与其他关于此问题的其他问题不同,我在我的路径上有lib,甚至在删除它时看到exception更改。 我确定我创建的dll有问题,但我不确定是什么。 这是我的java类代码: package com; public class Tune { static { System.loadLibrary(“lala”); } public static void main(String[] args) { Tune j = new Tune(); System.out.println(“2+6=”+j.add(2, 6)); } native public int add(int x,int y); } 这是我的javah生成的头文件的删节部分: /* * Class: com_Tune * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_Tune_add (JNIEnv *, jobject, jint, […]

java.lang.UnsatisfiedLinkError:Native Library XXX.so已经加载到另一个类加载器中

我已经部署了一个Web应用程序,其中包含以下代码。 System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME); 现在,我部署了另一个也具有相同代码的Web应用程序。 当它尝试加载库时,它会抛出以下错误。 Exception in thread “Thread-143” java.lang.UnsatisfiedLinkError: Native Library /usr/lib/jni/libopencv_java248.so already loaded in another classloader 我想同时运行这两个应用程序。 直到现在我尝试过: 在一个应用程序中加载库并将上述exception捕获到另一个应用程序 从两个应用程序中删除了jar并将opencv.jar放入Tomcat的类路径中(即在/ usr / share / tomcat7 / lib中)。 但上面没有一个工作,我可以做任何建议吗? 编辑:对于选项二, System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 这条线有效,但在我实际使用该库时会出现exception。 那是我关注的时候 Mat mat = Highgui.imread(“/tmp/abc.png”); 我得到了这个例外 java.lang.UnsatisfiedLinkError: org.opencv.highgui.Highgui.imread_1(Ljava/lang/String;)J at org.opencv.highgui.Highgui.imread_1(Native Method) at org.opencv.highgui.Highgui.imread(Highgui.java:362)

在JDK 10中为类文件生成JNI头文件

Java Native Interface(JNI)的一个组成部分是通过C头桥接JVM代码和本机代码。 生成这些头文件的方法过去非常简单:只需在类文件上调用命令行实用程序javah 。 然后,此过程将为使用native修饰符标记的任何方法生成原型。 但是,从Java 10开始, javah实用程序已被删除 ,其建议的替换是javac的新标志“-h”。 如果有可用的Java源文件,则替换工作正常,但是只有编译的类文件可用时才会出现问题。 (引发这个问题的问题是我正在尝试从Scala源生成JNI绑定。我当前的方法是首先编译它们然后在生成的类文件上运行javah。) 在只有编译的类文件可用的情况下,有没有办法生成C头文件,类似于javah习惯的方式?

使用JNI从Cocoa调用Java类函数

我真的很难弄清楚如何使用JNI从Objective-C调用Java函数。 我应该先说我对Java知之甚少,但对Obj-C非常熟悉。 我有一个Java类,我需要从我的应用程序包中调用一个方法。 jar位于bundle中的Resources文件夹内,我将NSJavaRoot设置为Content/Resources ,检查NSJavaPath , NSJavaPath包含2个jar文件的名称(主要的一个和一个依赖项)。 我正在使用对JNI_CreateJavaVM的调用来启动VM,然后尝试使用NSClassFromString查找类,这感觉不对,但这是我在搜索中找到的唯一方法。 我相信这个方法在使用已弃用的Java桥时是正确的,但我找不到任何使用JNI的示例或引用。 我的Java类看起来像这样: package foo; public class bar { public function dostuff() { } } 作为app流程的一部分,我需要调用dostuff()一次。 有没有人有任何想法如何做到这一点? 谢谢,J