java c 混合_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 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 extern "C" void cppsahhello(char* str); void cppsayhello(char* str) { std::cout< int main(int argc, char* argv[]) { csayhello("Hello world/n"); return 0; } /* csayhello.c */ #include 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 #import "SpeakLine.h" void objcsayhello(char* str) { id speak; /* 创建SpeakLine独享,将文本保存到该对象 * 然后使用Say显示该字符串 */ speak = [SpeakLine new]; [speak setString: str]; [speak say]; [speak free]; } /* SpeakLine.h */ #import @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 #include #include 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 #ifdef __cplusplus extern "C" { #endif extern void Java_HelloNative_sayHello(JNIEnv* env, jobject); #ifdef __cplusplus } #endif #endif /* __HelloNative__ */ /* HelloNative.c */ #include #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);

经验分享 程序员 微信小程序 职场和发展