cc++在javaandroid和objectivec三大平台下实现混合编程

上传人:第*** 文档编号:32683624 上传时间:2018-02-12 格式:DOCX 页数:19 大小:72.76KB
返回 下载 相关 举报
cc++在javaandroid和objectivec三大平台下实现混合编程_第1页
第1页 / 共19页
cc++在javaandroid和objectivec三大平台下实现混合编程_第2页
第2页 / 共19页
cc++在javaandroid和objectivec三大平台下实现混合编程_第3页
第3页 / 共19页
cc++在javaandroid和objectivec三大平台下实现混合编程_第4页
第4页 / 共19页
cc++在javaandroid和objectivec三大平台下实现混合编程_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《cc++在javaandroid和objectivec三大平台下实现混合编程》由会员分享,可在线阅读,更多相关《cc++在javaandroid和objectivec三大平台下实现混合编程(19页珍藏版)》请在金锄头文库上搜索。

1、Android 和 iOS 开发都支持 C+开发,可以一套代码多平台使用。同时 C+难以反编译的特性也可以为 Android 开发带来代码的保密,另一 native 特性也可以提高代码的运行效率。一、为什么使用 C/C+1. 便于移植,用 C/C+写得库可以方便在其他的平台上再次使用。2. 代码的保护,由于 java 层代码很容易被反编译,而 C/C+库反汇难度较大。3. 提高程序的执行效率,将要求高性能的应用逻辑使用 C/C+开发,从而提高应用程序的执行效率。4. 访问现有开源库,需要访问底层的 API 或引用一些只有 C/C+的库。二、开发工具介绍尽管 Android Studio 可以同

2、时编写 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 的文件写到整个项目都有,而是设计一个接口,用来做两个语言之间的

3、桥梁,他们之间的交互仅仅在这个接口。要点:String 类型转换/ Objective-C(NSString) - C+(std:string)NSString * ocString = Hello World,OC;std:string cppString = ocString UTF8String;std:cout Objective-C(NSString)std:string cppString2 = Hello World,C+;NSString *ocString2= NSString stringWithCString:cppString2.c_str() encoding:NSS

4、tring 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/JavaNativeF

5、oundation.framework/第三步:创建头文件,用于和 Java 交互 cn_taoweiji_nativemodule_NativeDemo.h#include #ifndef _Included_cn_taoweiji_nativemodule_NativeDemo#define _Included_cn_taoweiji_nativemodule_NativeDemo#ifdef _cplusplusextern C #endifJNIEXPORT jint JNICALL Java_cn_taoweiji_nativemodule_NativeDemo_add(JNIEnv

6、 *, 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 *, j

7、class, jobject);#ifdef _cplusplus#endif#endif第四步:创建实现 NativeDemo.cpp#include cn_taoweiji_nativemodule_NativeDemo.h#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

8、 Java_cn_taoweiji_nativemodule_NativeDemo_say(JNIEnv *env, jclass, jstring param)/ std:string - jstringconst 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 - st

9、d:string std:string str = Hi,I am C+.;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(cn/taoweiji/nativemodule/NativeDemo);/int subtract(i

10、nt , int param2) - (II)IjmethodID mid = env-GetMethodID(cls, subtract, (II)I);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 (

11、Product - Build).编译后文件根据自己的电脑环境,查找编译后的文件,我的路径是/Users/Wiki/Library/Developer/Xcode/DerivedData/DEMO_MAC_JNI-clxymnzifegyfaajsaattzgxqfbr/Build/Products/Debug/DEMO_MAC_JNI第六步:编写 JNI 接口package cn.taoweiji.nativemodule;/* 包名和类名称一定要和前面的 C+头文件对应* cn_taoweiji_nativemodule_NativeDemo.h*/public class NativeD

12、emo public static native int add(int param1, int param2);public static native void say(String name);public static native String getInfo(); public static native void nativeToJava(NativeDemo nativeDemo);public int subtract(int param1, int param2) System.out.println(NativeDemo: + String.format(%s - %s

13、= %s, param1, param2, param1 - param2);return param1 - param2;第七步:调用 C+public class Main static System.load(/Users/Wiki/Library/Developer/Xcode/DerivedData/DEMO_MAC_JNI-clxymnzifegyfaajsaattzgxqfbr/Build/Products/Debug/DEMO_MAC_JNI);public static void main(String args) System.out.println(Hello World

14、!);int result = NativeDemo.add(1, 2);System.out.println(1+2= + String.valueOf(result);NativeDemo.say(Hello,I am Java.);System.out.println(getInfo: + NativeDemo.getInfo();NativeDemo.nativeToJava(new NativeDemo();3. 在 ANDROID 项目中使用 NDKAndroid 的 JNI 开发,C+文件必须编写在独立的 module 里面,Java 接口代码可以编写在 app(module),

15、也可以和 C+放在同一个 module,通过 gradle 关联。详细代码请自行下载 demo 浏览gradle 配置(NativeModule )apply plugin: com.android.libraryandroid compileSdkVersion 23buildToolsVersion 24.0.0 rc2defaultConfig minSdkVersion 14targetSdkVersion 23versionCode 1versionName 1.0buildTypes release minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android.txt), proguard-rules.prondk moduleName joyrunstl stlport_staticldLibs log/用于解决_android_log_print abiFilters armeabi, armeabi-v7a, x86, x86_64, arm64-v8a/add -fexceptions to allow throw error/add -w to format not a

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号