我们有一个在Tomcat 6上运行的应用程序(准确地说是6.0.35.0),由于Catalina.await方法中的socketAccept调用抛出SocketException,我们在Mac OS上的大多数工程师都遇到启动Tomcat的问题:
SEVERE: StandardServer.await: accept:
java.net.SocketException: Invalid argument
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.socketAccept(PlainSocketImpl.java)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:431)
at org.apache.catalina.startup.Catalina.await(Catalina.java:676)
at org.apache.catalina.startup.Catalina.start(Catalina.java:628)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
at mycompany.tomcat.startup.ThreadDumpWrapper.main(ThreadDumpWrapper.java:260)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.tanukisoftware.wrapper.WrapperStartStopApp.run(WrapperStartStopApp.java:238)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud)
这会导致Tomcat在启动后立即关闭(并且没有少量的愤怒).我们认为这在Mac OS w/Java 1.7上一直存在,在过去的几个月里,我们很多人已经转向Macbook Pros.到目前为止,唯一的症状是来自Tomcat的偶然零字节响应,因为这个异常也被抛出在socketRead上.错误没有打到日志,我们单独耸了耸肩作为一个孤立的问题,只有在启动问题开始时才找到原因并设置了SocketException断点:
Daemon Thread [http-8080-1] (Suspended (breakpoint at line 47 in SocketException))
SocketException.<init>(String) line: 47
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available …Run Code Online (Sandbox Code Playgroud) 我试图使用JNA调用DLL中的方法.到目前为止已经加载了DLL
Runtime.getRuntime().load("myworkspace/test.dll");
Run Code Online (Sandbox Code Playgroud)
这个dll包含了我需要访问的方法.如何在Java文件中执行DLL中的方法.我是否创建了一个对象或DLL的某些东西,然后在点运算符后获取方法名称.
E:\Code\Java\JNITest>java test
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Code\Java\JNITest\test.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at test.main(test.java:16)`
Run Code Online (Sandbox Code Playgroud)
在使用Java Native Interface时,我遇到了一个产生此错误的问题.我相信这是因为我使用MinGW编译了.dll,它编译成32位.dll而我的系统是64位,因此我的Java运行在64位.反正有没有迫使我的Java以32位运行?
我在Windows中使用Code :: Blocks.
我创建了一个dll项目试图获得一些JNI练习.
在javah生成的.h文件中,有#include jni.h,但是当我尝试编译它时,它一直在说jni.h:没有这样的文件或目录.
我认为它与classpath有关,但我不知道它是什么!它可能设置我必须在Code :: Blocks中进行更改
有人可以帮我解决一下吗?非常感谢
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Vector3D */
#ifndef _Included_Vector3D
#define _Included_Vector3D
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Vector3D
* Method: magnitude
* Signature: ()D
*/
JNIEXPORT jdouble JNICALL Java_Vector3D_magnitude
(JNIEnv *, jobject);
/*
* Class: Vector3D
* Method: mult
* Signature: (LVector3D;I)LVector3D;
*/
JNIEXPORT jobject JNICALL Java_Vector3D_mult
(JNIEnv *, jobject, jobject, jint);
/*
* …Run Code Online (Sandbox Code Playgroud) 我是C++和JNI的新手,我试图通过使用JNI找到一种正确的方法将java中的byte []转换为C++中的unsigned char*,反之亦然!(我正在研究android)在google和SO中寻找解决方案之后,我还没有找到一个很好的细节方法将java中的byte []转换为C++.请帮助我,并提供相反的解决方案(C++中的unsigned char*到java中的byte []).非常感谢
JAVA:
private static native void nativeReceiveDataFromServer(byte[] value, int length);
Run Code Online (Sandbox Code Playgroud)
JNI:
... (JNIEnv* env, jobject thiz, jbyteArray array, jint array_length)
{
???
}
Run Code Online (Sandbox Code Playgroud)
PS:我修改了我的问题,因为我的问题是一个真正的问题:(
我尝试在Nexus 9上使用本机库运行应用程序.
应用程序退出并显示错误消息:
java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit
Run Code Online (Sandbox Code Playgroud)
是否有任何已知的解决方法来解决此问题(当然,重新编译库并使apk更大)?
我怎样才能指出java.library.patheclipse项目中的两个不同- 运行配置?我需要这两个库:
-Djava.library.path=/opt/hdf-java/build/bin
-Djava.library.path=/opt/opencv-2.4.10/build/lib
Run Code Online (Sandbox Code Playgroud)
问候.
java java-native-interface jvm jvm-arguments java.library.path
在Java 1.4中,您可以使用((SunToolkit)Toolkit.getDefaultToolkit()).getNativeWindowHandleFromComponent()但已删除.
看起来您现在必须使用JNI来执行此操作.您是否有JNI代码和示例Java代码来执行此操作?
我需要这个来调用Win32 GetWindowLong和SetWindowLong API调用,这可以通过Jawin库完成.
我想要一些非常精确的东西,所以我可以传递对JDialog或JFrame的引用并获取窗口句柄.
使用JNI的Swing透明度可能是相关的.
我想从Java调用C++方法.我读到了JNI,但我没有得到如何获取所有库文件以及我应该保留它以便从命令行运行程序.
有没有办法从Eclipse本身调用C++方法,因为我用它来运行Java类.
围绕获取原生opencv for android构建有很多问题和答案.有些使用gradle,有些则使用外部工具.对于原生OpenCV构建,这些众多,复杂且经常相互矛盾的描述可能会以一致的起点进行简化; 在创建Android Studio 2.2 Beta项目时,有一种方法可以包含C++支持:


此功能是在2016年6月左右添加的.有关详细信息,请参阅Android工具技术文档.
将Android Studio 2.2或更高版本与Gradle 2.2.0或更高版本的Android插件一起使用,您可以将C和C++代码编译到Gradle可以与您的APK打包的本机库中,从而为您的应用添加C和C++代码.然后,您的Java代码可以通过Java Native Interface(JNI)调用本机库中的函数.如果您想了解有关使用JNI框架的更多信息,请阅读适用于Android的JNI技巧.
检查Include C++ Support生成一个名为的外部构建文件CMakeLists.txt.
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# …Run Code Online (Sandbox Code Playgroud) windows java-native-interface cmake android-studio opencv4android