Tag: java

将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和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 […]

Java SSLSocket握手失败

我正在尝试找到一种方法来建立使用SSL的Java客户端和C服务器的连接。 这是java客户端: import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; public class Main { public static void main(String[] args) throws IOException { SSLSocketFactory sslsockfact = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket sslsocket = (SSLSocket) sslsockfact.createSocket( args[0], Integer.parseInt(args[1])); sslsocket.startHandshake(); System.in.read(); } } 它只是建立连接和执行握手的几个函数,但我收到此错误: Exception in thread “main” javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at […]

自动装箱和强制之间有什么区别?

我用Java,C和Python编程。 算术类型之间自动强制的规则已得到扩充,以处理更丰富的类型集 资料来源:“C编程语言” 但“强制”是什么意思呢? 答案说它就像类型转换和隐式转换和隐式类型转换,并在我阅读它时称为自动装箱。 那么自动装箱和强制之间的区别是什么? 谢谢

使用Java的流程构建器来调用C程序

尝试使用Java的流程构建器调用C程序,但不知道在流程构建器调用中调用什么。 Process p = new ProcessBuilder(“myCommand”, “myArg”).start(); 对于myCommand和myArg ,我将用什么值替换它来运行C程序? 我希望它调用的程序如下所示: calculator.c: #include int main () { int a = 4; int b = 2; int c = a + b; printf(“Result: %d \n”, c); }

优化:switch语句中的case的顺序是否重要?

考虑使用您选择的语言的switch语句(例如,Java,C,C#…)。 当然,如果存在突破,则case语句的顺序很重要,但假设每个case都有break ,因此顺序没有语义重要性。 例如,在考虑优化时, case陈述的顺序是否重要? 是按升序对案件进行排序还是在订购中没有任何好处? 编译器可能执行哪些优化可能取决于case的顺序。 由于任何编译器可能会也可能不会选择这样的优化,我不想在这里要求特定的语言或编译器。 问题是关于可能发生的事情。

Glib内存分配错误

我在ubuntu上使用库libfprint ,我试图通过我的java代码调用一个函数。 API_EXPORTED struct fp_img *fpi_img_new(size_t length) { struct fp_img *img = g_malloc(sizeof(*img) + length); memset(img, 0, sizeof(*img)); fp_dbg(“length=%zd”, length); img->length = length; return img; } 我从我的java代码传递整数值5到此函数。 当我尝试执行上述function时,我遇到以下错误: GLib-ERROR **: /build/buildd/glib2.0-2.30.0/./glib/gmem.c:170: failed to allocate 3077591024 bytes 我在2个不同的ubuntu机器上尝试了相同的代码,但错误仍然相同。 我不知道为什么它试图为24 + 5长度分配这么多字节。 有人能建议我解决吗?

关于clsStr变量的全局是什么,“clsStr =(* env) – > NewGlobalRef(env,cls)”?

JNI中的全局引用被认为是必须由程序员手动释放的引用。 它与c上下文无关。 所以像这样的代码: { jclass clsStr = (*env)->NewGlobalRef(env,cls); } return clsStr; 会给出一个错误,说clsStr是未定义/未声明的 。 我理解这一点。 但我不明白的是使用这些类型的参考。 在上面的代码中clsStr全局是什么? 此变量在将来或在调用返回后如何有用? 我还读到“基本上,全局引用对于确保它(及其内容)将存活到下一个JNI调用是有用的”但我不明白这一点。

如何通过Java中的指针算法访问数组元素

鉴于C中的以下声明,我可以对地址应用“+”,并访问其他元素。 char toto[5]; 换句话说,应用此运算符+ toto+0x04 在Java中访问不同的数组元素。 还有另一种在java中实现此操作的方法吗? 非常感谢