c/c++ java 比较

guzhijie1981 2010-02-25 06:06:23
1;这个题目不是为了谈论他们的区别;只是我在工作学习中用到了3种语言;最近又使用了java的jni调用本地方法;所以突然之间想写篇文章;来比较3种语言;这种比较不是想谈他们的 优劣;而是想把3种语言的各个问题的实现和方法写出来;也为刚学习语言的朋友抛砖引玉;
本人虽然涉及到3种语言;但是都略懂皮毛;所以如果有错误的地方还想大家指出来;
2;jni;java native interface;
先写这个是因为最近几天在搞这个;所以把列子放上来;后面再介绍3种语言的差别和实现;我尽可能多的写些例子;
大家知道;java之所以说是跨平台的是因为有java虚拟机来运行java代码;所以有的时候;由于出于效率的考虑;必须通过本地方法来实现;这个就是所谓的jni ;那么java 如何调用c或者c++ 写的代码呢;是通过函数吗?不是的;是通过动态库;
由于我的代码是在linux下跑的;所以我的动态库叫jniCalllib.so;
可能很多朋友不知道什么叫动态库;我们调用库函数的时候;很多时候编译代码的时候;是不会直接把库函数;编译到程序里面的;而是给一个连接;当代码运行到调用库函数的时候;操作系统才加载这个库函数所在的动态库;在windows 上是dll;在linux 上;是so;
好了;现在上代码;
这个是java 代码;
package com.ar.jni;

public class JniCall
{
static
{
System.loadLibrary("jniCall");
}

public static native void jniVoid();

public static native int jniInt(int i);

public static native String jniString(String str);

public static native int[] jniIntArray(int[] intArray);

public static native JniClass jniObject(JniClass obj);

public static native JniClass[] jniOvjectArray(JniClass[] objArray);

}

由于涉及到公司名字;所以com后面的包名字我修改了;下同;
这个System.loadLibrary("jniCall");就是让java虚拟机加载动态库;jnicall就是我的库的名字;我们知道用static 修饰的语句在第一次加载时候;是一定被执行的;比如说第一次new 这个类;我记得《think in java》上有写;大家可以去翻翻;
接下来的一大段就是本地方法;必须用public 和native 修饰;是否用static 修饰;关系到c++的实现;我们知道用static 修饰的是类方法;不修饰的是对象方法;
1,通过编译之后就生成了class 文件;我一般是用eclipse的;大家也可以通过javac命令来编译;好了;我们可以看到bin文件夹下有.class文件;
2,通过javah -jni com.ar.jni.JniCall 来编译生成h文件;记住一定要在com上面的文件夹敲这个命令;而后面的文件必须是完整的类名;我在这里消耗了很多时间;
3;打开h文件;我一般是拷贝生成一个c文件;只需要改扩展名为.c;
c 代码如下;代码注释的 地方是我的测试;我想大家大体能够知道要怎么做;如果有不明白再问我;实在不想再注释了;将来把对象数组搞好了;大家对比下应该不难明白;
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ar_jni_JniCall */

#ifndef _Included_com_ar_jni_JniCall
#define _Included_com_ar_jni_JniCall
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ar_jni_JniCall
* Method: jniVoid
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_ar_jni_JniCall_jniVoid
(JNIEnv * env, jclass thiz)
{
printf("this function is used for test jni call\n");
return;
}

/*
* Class: com_ar_jni_JniCall
* Method: jniInt
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_ar_jni_JniCall_jniInt__I
(JNIEnv * env, jclass thiz, jint i)
{
printf("this function is used for return double times value of input int value\n");
printf("the int value input is :%d\n",i);
return 2*i;

}

/*
* Class: com_ar_jni_JniCall
* Method: jniInt
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ar_jni_JniCall_jniString
(JNIEnv * env, jclass thiz, jstring str)
{
printf("this function is used for return the input string to java!\n");
const char * pCh = (*env)->GetStringUTFChars(env,str,NULL);
printf("this string input is: %s\n",pCh);
jstring rest = (*env)->NewStringUTF(env,pCh);
(*env)->ReleaseStringUTFChars(env,str,pCh);
return rest;
}

/*
* Class: com_ar_jni_JniCall
* Method: jniIntArray
* Signature: ([I)[I
*/
JNIEXPORT jintArray JNICALL Java_com_ar_jni_JniCall_jniIntArray
(JNIEnv * env, jclass thiz, jintArray array)
{
jsize len = (*env)->GetArrayLength(env,array);
jint *intArray = (*env)->GetIntArrayElements(env,array,NULL);
//(*env)->ReleaseIntArrayElements(env,array,intArray,0);
int i;
for(i = 0;i <len ;i++)
{
*(intArray+i) *= 2;
}
jintArray restArray = (*env)->NewIntArray(env,len);
(*env)->SetIntArrayRegion(env,restArray,0,len,intArray);

return restArray;
}

/*
* Class: com_ar_jni_JniCall
* Method: jniObject
* Signature: (Lcom/ar/jni/JniClass;)Lcom/ar/jni/JniClass;
*/
JNIEXPORT jobject JNICALL Java_com_ar_jni_JniCall_jniObject
(JNIEnv * env, jclass thiz, jobject obj)
{
jclass jniObj = (*env)->GetObjectClass(env,obj);

jclass retClass = (*env)->FindClass(env,"com/ar/jni/JniClass");


jmethodID methodId = (*env)->GetMethodID(env,retClass,"<init>","(Ljava/lang/String;)V");
//jmethodID methodId = (*env)->GetMethodID(env,retClass,"<init>","(I)V");


// jfieldID countId = (*env)->GetStaticFieldID(env,jniObj,"count","I");
// jint count = (*env)->GetStaticIntField(env,jniObj,countId);

// jfieldID nameId = (*env)->GetFieldID(env,jniObj,"name","Ljava/lang/String;");
// jstring name = (*env)->GetObjectField(env,jniObj,nameId);
// const char * pCh = (*env)->GetStringUTFChars(env,obj,NULL);
// printf("%s\n",pCh);

//jclass jniObj2 = (*env)->GetObjectClass(env,name);


// jmethodID methodId = (*env)->GetMethodID(env,jniObj,"getName","()Ljava/lang/String;");
// jobject nameById = (*env)->CallObjectMethod(env,obj,methodId);

// jmethodID methodId2 = (*env)->GetStaticMethodID(env,jniObj,"getCount","()I");
// jint countById = (*env)->CallStaticIntMethod(env,obj,methodId2);
jstring name = (*env)->NewStringUTF(env,"this message is from c++!");
printf("%s\n",(*env)->GetStringUTFChars(env,name,NULL));
//jint count = 100;
jobject retObj = (*env)->NewObjectV(env,retClass,methodId,&name);
//(*env)->CallVoidMethodV(env,retObj,methodId,&name);

//retObj = (*env)->CallObjectMethodV(env,obj,methodId,"hello this message is from c++");


//printf("count is :%d \n",count);
//printf("name is :%s\n",pCh);
return retObj;
}


/*
* Class: com_ar_jni_JniCall
* Method: jniOvjectArray
* Signature: ([Lcom/ar/jni/JniClass;)[Lcom/ar/jni/JniClass;
*/
JNIEXPORT jobjectArray JNICALL Java_com_ar_jni_JniCall_jniOvjectArray
(JNIEnv *env , jclass thiz, jobjectArray objArray)
{
return NULL;
}

#ifdef __cplusplus
}
#endif
#endif
==================================================================================
package com.ar.jni;

public class JniClass
{
public static int count = 0;
public String name = null;

public JniClass(String inName)
{
name = inName;
count++;
}
public JniClass(int inCount)
{
count = inCount;
}


public String getName()
{
return name;

}

public static int getCount()
{
return count;
}

}
好了;下班时间了;下次争取把其他东西讲下;闪人了
...全文
392 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
guzhijie1981 2010-03-02
  • 打赏
  • 举报
回复
还没有 时间写呢;不急啊;
breezes2008 2010-03-02
  • 打赏
  • 举报
回复
没见到有什么比较,倒是可以发到java开发区。
zhuzhu_hsbbc 2010-03-02
  • 打赏
  • 举报
回复
呃…我没深入涉足JAVA,在楼主面前,自愧啊!
aozhi 2010-03-01
  • 打赏
  • 举报
回复
lz说的挺好。稍微有点长。
arisun 2010-03-01
  • 打赏
  • 举报
回复
喜欢这种一舒己见的,先顶再看
yaoqian156 2010-02-28
  • 打赏
  • 举报
回复
为毛我觉得C++比java好用多了?我现在转JAVA&&WEB平台,痛苦的死去活来
pauliuyou 2010-02-27
  • 打赏
  • 举报
回复
java语法和C差不多,但是用法却差得很多。 用JAVA可以用现成的东西,而用C得现造工具
CCCCCCCCCCCCCCC 2010-02-26
  • 打赏
  • 举报
回复
此贴必将引来口水无数,mark
cq_gongyoulong 2010-02-26
  • 打赏
  • 举报
回复
JAVA接触过一点, 应该要比C语言简单~
gql1123 2010-02-26
  • 打赏
  • 举报
回复
底层C,上层C++andjava. 没搞过java
赵4老师 2010-02-26
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言、架构……
某某9 2010-02-26
  • 打赏
  • 举报
回复
喜欢C!
steptodream 2010-02-25
  • 打赏
  • 举报
回复
楼主是来开讲座的
ccnyou 2010-02-25
  • 打赏
  • 举报
回复
呃…我没深入涉足JAVA,在楼主面前,自愧啊!
musiclee 2010-02-25
  • 打赏
  • 举报
回复
汗。。内容与标题不太符合哈。。。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧