C/C++和Java混合语言编程

一.C++和C的混合
1.C++中调用C
只要在C++程序中,将C函数声明为extern "C"
/* cpp2c.cpp */
extern "C" void csayhello(char* str);
 
int main(int argc, char* argv[])
{
    csayhello("Hello world!/n");
    return 0;
}
 
/* csayhello.c */
#include <stdio.h>
void csayhello(char* str)
{
    printf("%s", str);
}
 
/* 编译和链接 */
g++ -c cpp2c.cpp -o cpp2c.o
gcc -c csayhello.c -o csayhello.o
gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c
 
2.C中调用C++
/* cppsayhello.cpp */
#include <iostream>
extern "C" void cppsahhello(char* str);
 
void cppsayhello(char* str)
{
    std::cout<<str<<"/n";
}
 
/* c2cpp.c */
int main(int argc, char* argv[])
{
    cppsayhello("Hello world/n");
    return 0;
}
 
/* 编译和链接 */
g++ -c cppsayhello.cpp -o cppsayhello.o
gcc -c c2cpp.c -o c2cpp.o
gcc cppsayhello.o c2cpp.o -lstdc++ -o c2cpp
 
二.混合Object-C和C
1.在Object-C中调用C
/* objc2c.m */
#import <stdio.h>
int main(int argc, char* argv[])
{
    csayhello("Hello world/n");
    return 0;
}
 
/* csayhello.c */
#include <stdio.h>
void csayhello(char* str)
{
    printf("%s", str);
}
 
/* 编译和链接 */
gcc -Wno-import -c objc2c.m -o objc2c.o
gcc -c csayhello.c -o csayhello.o
gcc objc2c.o csayhello.o -lobjc -o obj2c
 
2.在C中调用Object-C
/* objcsayhello.m */
#import <objc/Object.h>
#import "SpeakLine.h"
void objcsayhello(char* str)
{
    id speak;
    /* 创建SpeakLine独享,将文本保存到该对象
     * 然后使用Say显示该字符串
     */
    speak = [SpeakLine new];
    [speak setString: str];
    [speak say];
    [speak free];
}
 
/* SpeakLine.h */
#import <objc/Object.h>
@interface SpeakLine : Object
{
    char* string;
}
- setString: (char*) str;
- say;
- free;
@end
 
/* SpeakLine.m */
#import "SpeakLine.h"
@impleamentation SpeakLine
 
+ new
{
    self = [super new];
    return self;
}
 
- setString: (char*) str
{
    string = str;
    return self;
}
 
- say
{
    printf("%s",string);
    return self;
}
 
- free
{
    return [super free];
}
 
/* 编译和链接 */
gcc -Wno-import -c objcsayhello.m -o objcsayhello.o
gcc -Wno-import -c SpeakLine.m -o SpeakLine.o
gcc -c c2objc.c -o c2objc.o
gcc c2objc.o objcsayhello.o SpeakLine.o -lobjc -o c2objc
 
三.混合Java和C++
1.C++中调用Java类的静态方法
下例中传见Java类的java.lang.String的对象,并将它传递给方法
java.lang.System.out()加以显示:
 
/* cnistrout.cpp */
/* 使用CNI可以从C++代码中访问Java类 */
#include <gcj/cni.h>
#include <java/lang/System.h>
#include <java/io/PrintStream.h>
int main(int argc, char* argv[])
{
    java::lang::String* str;
     
    JvCreateJavaVM(NULL);
    JvAttachCurrentThread(NULL, NULL);
     
    str = JvNewStringLatin1("Hello world");
    java::lang::System::out->println(str);
     
    JvDetachCurrentThread();
}
 
/* 编译和链接 */
g++ cnistrout.cpp -lgcj -o cniexception
 
2.混合Java和C--具有本地方法的Java类
/* HelloNative.java */
public class HelloNativ {
    static {
        System.loadLibrary("libspeak.so");
    }
    public static void main(String arg[]) {
        HelloNative hn = new HelloNative();
        hn.sayHello();
    }
    public native void sayHello();
}
 
gcj -C HelloNative.java
/* 用gcjh选项-jni生成由文件HelloNative.class创建头文件 */
gcjh -jni HelloNative
 
生成的头文件如下:
/* HelloNative.h */
 
/* DO NOT EDIT THIS FILE - is is machine generated */
#ifndef __HelloNative__
#define __HelloNative__
 
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
 
extern void Java_HelloNative_sayHello(JNIEnv* env, jobject);
 
#ifdef __cplusplus
}
#endif
 
#endif /* __HelloNative__ */
 
/* HelloNative.c */
#include <jni.h>
#include "HelloNative.h"
 
void Java_HelloNative_sayHello(JNIEnv* env, jobject this)
{
    printf("A native JNI hello/n");
}
 
/* 编译和链接 */
gcc -fpic -c HelloNative.c -o HelloNative.o
gcc -shared HelloNative.o -o libspeak.so
 
 
3.在C中调用Java类方法
需要JNIEnv的GetObjectClass获取jclass对象,
然后从jclass对象的GetMethodID获取到对象的方法的ID,
最后调用JNIEnv的CallVoidMethod等方法调用jclass对象的指定方法.
jclass class = (*env)->GetObjectClass(env, obj);
jmethodID id = (*env)->GetMethodID(env, class, "characterCallback", "(C)V");
(*env)->CallVoidMethod(env, obj, id, character);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值