CC++在JavaAndroid和ObjectiveC三大平台下实现混合编程

2020-09-17 09:34

Android和iOS开发都支持C++开发,可以一套代码多平台使用。同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率。

一、为什么使用C/C++

1. 便于移植,用C/C++写得库可以方便在其他的平台上再次使用。

2. 代码的保护,由于java层代码很容易被反编译,而C/C++库反汇难度较大。 3. 提高程序的执行效率,将要求高性能的应用逻辑使用C/C++开发,从而提高应用

程序的执行效率。

4. 访问现有开源库,需要访问底层的API或引用一些只有C/C++的库。

二、开发工具介绍

尽管Android Studio可以同时编写C++和Java代码,写完就可以编译运行,但是对联想和错误提示并不是非常友好,个人建议C++的整体代码使用Visual Studio或Xcode编译开发,联想功能非常友好,编译速度很快,调试也非常方便。

? ? ? ?

Visual Studio(PC) Xcode(Mac)

Android Studio(多平台) eclipse(多平台)

三、第一行代码

1. 如何在Objective-C项目中使用C++;

在Objective-C使用C/C++非常简单,仅仅需要把.m后缀的文件改成.mm即可使用C++,我们通常不会把.mm的文件写到整个项目都有,而是设计一个接口,用来做两个语言之间的桥梁,他们之间的交互仅仅在这个接口。 要点:String类型转换

// Objective-C(NSString) -> C++(std::string) NSString * ocString = @\; std::string cppString = [ocString UTF8String]; std::cout< Objective-C(NSString) std::string cppString2 = \; NSString *ocString2= [NSString stringWithCString:cppString2.c_str() encoding:[NSString defaultCStringEncoding]]; NSLog(@\,ocString2); 记得要include相关的文件

#include #include 2.在普通的JAVA项目中使用JNI编程

由于我是在MAC下办公,所以这里就介绍如何在MAC下进行JNI开发,在Windows平台下的Virtual Studio也很简单。

第一步:在Xcode下创建一个普通的C++项目

第二步:关联JavaVM的Framework 路径:

/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaNativeFoundation.framework/

第三步:创建头文件,用于和Java交互 cn_taoweiji_nativemodule_NativeDemo.h

#include #ifndef _Included_cn_taoweiji_nativemodule_NativeDemo #define _Included_cn_taoweiji_nativemodule_NativeDemo #ifdef __cplusplus extern \ { #endif JNIEXPORT jint JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_add (JNIEnv *, jclass, jint, jint); JNIEXPORT void JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_say (JNIEnv *, jclass, jstring); JNIEXPORT jstring JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_getInfo (JNIEnv *, jclass); JNIEXPORT void JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_nativeToJava (JNIEnv *, jclass, jobject); #ifdef __cplusplus } #endif #endif 第四步:创建实现 NativeDemo.cpp

#include \ #include JNIEXPORT jint JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_add(JNIEnv *, jclass, jint param1, jint param2) { jint result = param1 + param2; return result; } JNIEXPORT void JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_say(JNIEnv *env, jclass, jstring param) { // std::string -> jstring const char *param_char = env->GetStringUTFChars(param, NULL); std::string str = param_char; } JNIEXPORT jstring JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_getInfo(JNIEnv *env, jclass) { // jstring -> std::string std::string str = \; jstring result = env->NewStringUTF(str.c_str()); return result; } JNIEXPORT void JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_nativeToJava(JNIEnv * env, jclass, jobject obj) { // 调用Java方法 jclass cls = env->FindClass(\); //int subtract(int param1www.baiyuewang.net, int param2) -> (II)I jmethodID mid = env->GetMethodID(cls, \, \); int result = (int) env->CallIntMethod(obj, mid, 10, 2); // std::cout< ()Ljava/lang/String; //PackageInfo getPackageInfo(String packageName, int flags); //-> (Ljava/lang/String;I)Landroid/content/pm/PackageInfo;; } 第五步:编译生成JNI文件,按 ?+B (Product -> Build). 编译后文件

根据自己的电脑环境,查找编译后的文件,我的路径是

/Users/Wiki/Library/Developer/Xcode/DerivedData/DEMO_MAC_JNI-clxymnzifegyfaajsaattzgxqfbr/Build/Products/Debug/DEMO_MAC_JNI

第六步:编写JNI接口

package cn.taoweiji.nativemodule; /** * 包名和类名称一定要和前面的C++头文件对应


CC++在JavaAndroid和ObjectiveC三大平台下实现混合编程.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:03组合逻辑电路数电

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: