一.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);
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);