1.首先2者提供的接口不同,这点很容易区分。
2.java跨平台,写好的程序不用做任何修改就可以放到linux或者windows或者苹果等诸多 *** 作系统上运行,C当然可以,但linux本身提供了socket的
系统调用
,你如果使用的是linux系统调用,那么你的程序只能在linux下运行,这点不难理解。但如果是C的
库函数
,那还是可以跨平台的
3.利用linux系统调用的速度是要快于JAVA提供的SOCKET接口。
相同性我就不说了,你看完我下面的话,你就能理解他们直接的关系了。
从你提出的问题,我觉的你可能对编程不是很了解。
socket是用来实现
进程通信
(主要是网络通信)的目的,但这不是语言能够解决的问题,确切的说语言连什么是进程他都不知道。这么说来SOCKET不是JAVA带的功能,那么JAVA是如何来实现这一功能的呢?JAVA是通过调用系统提供的SOCKET来完成的。
在LINUX里面,JAVA中的SCOKET最终就是通过调用系统提供的系统调用来完成,而系统调用的SOCKET则是 *** 作系统和硬件共同完成的。所以他们共同点是,如果你的
JAVA程序
是在LINUX中运行的,那他们通信的具体过程会完全一样,只不过JAVA会在系统调用前面加上一些它认为必需加的东西或者是它认为能够方便编程人员使用的东西。
你的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才能解析其中含义。
publicProcess
exec(String
[]
cmdArray,
String
[]
envp,File
dir)
这个方法中cmdArray是一个执行的命令和参数的字符串数组,数组的第一个元素是要执行的命令往后依次都是命令的参数,envp是执行的环境,,envp中使用的是name=value的方式。File
dir是执行目录。
获取返回使用process.getInputStream()
这样能和shell进行交互,可以把C代码编译了,再通过这也方法来调用和传递参数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)