「java调用.h」java调用https
今天给各位分享java调用.h的知识,其中也会对java调用https进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、在java本地方法调用中,jni.h这个文件起到的作用是什么?它和jniEvn是什么关系?为什么必须要引入jni.h...
- 2、java 如何调用lib和h文件
- 3、Linux环境下java调用C
- 4、java如何调用c语言源文件并进行执行?
在java本地方法调用中,jni.h这个文件起到的作用是什么?它和jniEvn是什么关系?为什么必须要引入jni.h...
简单的回答就是需要本地库函数。
从Java原理来讲,你还要看下文:
本地方法调用就是 Java Native Interface(JNI),JNI最终的目的是在Java端调用本地系统的方法,Java之所以跨平台是因为JVM的设计是基于堆栈的,而像C、C++是基于寄存器的,寄存器应该懂吧,每个硬件的寄存器都不相同。JAVA class类运行在JVM中,即在堆栈(逻辑的数据结构)中,这个堆栈的数据结构都一样,所以就JAVA就有了跨平台。
而有的时候JAVA想直接对计算机硬件操作,即直接对寄存器操作,那么就需要相应的本地库,jni.h就是本地库。这个本地库内的API都是完全基于寄存器来操作的。
一个字一个字敲的,不知道我说的你明白没?
如果你明白基于堆栈和寄存器的区别,理解JNI就没问题了。
java 如何调用lib和h文件
LIB文件直接加入到工程文...
给java或者c#用),其中,前者最简单,后者需要在dllmain()中生成。
Linux环境下java调用C
你的JNI 写错了吧
java里的 char和 C的char完全不是一回事
java里你要写 stringjava_encryptpswd(string Password, string EncryptedKey );
生成的 C头文件,应该是 jstring java_encryptpswd(JEnvi* pEnvi,jstring Password,jstring EncryptedKey)
我手写的,没查资料,大概是这样。。
然后第一个参数是当前虚拟机事例,里面有很多可用的函数
后面两个是java里字符串结构,在C里面的表示法, 其实它就是指针而已。
然后你可以用pEnvi里的函数,将java的string,转化成 c的string。
然后调用 C的头文件的函数,得到结果,在组装成java的字符串。
比如例子:
我要用C来实现 java的字符串定位。
No.1 定义java的本地接口
public native String NAConvert(String arg1,String arg2);
No.2 生成头文件
JNIEXPORT jstring JNICALL Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv *, jobject, jstring, jstring);
No.3 自己创建一个实现文件,实现上面函数
jstring Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv* env, jobject obj, jstring arg1, jstring arg2)
{
jsize len = env-GetStringLength(arg1);
jchar* pBuf = new jchar[len+1];
env-GetStringRegion(arg1,0,len,pBuf);
jclass m = env-FindClass("java/lang/String");
jmethodID mid = env-GetMethodID(m,"charAt","(I)C");
jchar c = env-CallCharMethod(arg1,mid,1);
return arg1 ;
}
第一个是虚拟机事例指针,第二个参数是接口方法所在对象的 this。
第三个及以后才是你的接口的参数。
java里传入的所有对象参数,在C里面都是句柄。必须要用第一个参数env才能解析其中含义。
java如何调用c语言源文件并进行执行?
要在java中调用c语言的库,需要使用Java提供了JNI。\x0d\x0a举例说明\x0d\x0a在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.\x0d\x0a现在分别从Java和C语言两部分说明:\x0d\x0a1. Java 部分\x0d\x0a首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:\x0d\x0apublic class HelloNative {\x0d\x0apublic native void sayHello();\x0d\x0a}\x0d\x0a\x0d\x0a编译这个类,生成class文件:\x0d\x0ajavac HelloWorld.java\x0d\x0a\x0d\x0a利用javah生成需要的h文件\x0d\x0ajavah HelloNative\x0d\x0a\x0d\x0a生成的 h文件大概如下:\x0d\x0a\x0d\x0a/* DO NOT EDIT THIS FILE - it is machine generated */\x0d\x0a#include \x0d\x0a/* Header for class HelloNative */\x0d\x0a\x0d\x0a#ifndef _Included_HelloNative\x0d\x0a#define _Included_HelloNative\x0d\x0a#ifdef __cplusplus\x0d\x0aextern "C" {\x0d\x0a#endif\x0d\x0a/*\x0d\x0a* Class: HelloNative\x0d\x0a* Method: sayHello\x0d\x0a* Signature: ()V\x0d\x0a*/\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello\x0d\x0a(JNIEnv *, jobject);\x0d\x0a\x0d\x0a#ifdef __cplusplus\x0d\x0a}\x0d\x0a#endif\x0d\x0a#endif\x0d\x0a\x0d\x0a可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。\x0d\x0a2. C语言部分\x0d\x0a根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include "HelloNative.h"\x0d\x0a\x0d\x0aJNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)\x0d\x0a{\x0d\x0aprintf("Hello World!\n");\x0d\x0a}\x0d\x0a\x0d\x0a代码编写完成之后,我们再用gcc编译成库文件,命令如下;\x0d\x0agcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp\x0d\x0a\x0d\x0a这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.\x0d\x0a接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");\x0d\x0a\x0d\x0apublic class TestNative\x0d\x0a{\x0d\x0astatic {\x0d\x0atry {\x0d\x0aSystem.loadLibrary("HelloNative");\x0d\x0a}\x0d\x0acatch(UnsatisfiedLinkError e) {\x0d\x0aSystem.out.println( "Cannot load hello library:\n " + e.toString() );\x0d\x0a}\x0d\x0a}\x0d\x0apublic static void main(String[] args) {\x0d\x0aHelloNative test = new HelloNative();\x0d\x0atest.sayHello();\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a但是再编译后,运行的时候,问题又出现了.\x0d\x0aCannot load hello library:\x0d\x0ajava.lang.UnsatisfiedLinkError: no HelloNative in java.library.path\x0d\x0aException in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V\x0d\x0aat HelloNative.sayHello(Native Method)\x0d\x0aat TestNative.main(TestNative.java:13)\x0d\x0a\x0d\x0a载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?\x0d\x0a用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:\x0d\x0a1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好\x0d\x0a2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中\x0d\x0a3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH\x0d\x0a这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了
java调用.h的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java调用https、java调用.h的信息别忘了在本站进行查找喔。
发布于:2022-11-30,除非注明,否则均为
原创文章,转载请注明出处。