Android和iOS开发都支持C++开发,可以一套代码多平台使用。同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率。
一、为什么使用C/C++
便于移植,用C/C++写得库可以方便在其他的平台上再次使用。
代码的保护,由于java层代码很容易被反编译,而C/C++库反汇难度较大。
提高程序的执行效率,将要求高性能的应用逻辑使用C/C++开发,从而提高应用程序的执行效率。
访问现有开源库,需要访问底层的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 = @"Hello World,OC";
std::string cppString = [ocString UTF8String];
std::cout<
// C++(std::string) -> Objective-C(NSString)
std::string cppString2 = "Hello World,C++";
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 "C" {
#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 "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 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 = "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(int param1, int param2) -> (II)I
jmethodID mid = env->GetMethodID(cls, "subtract", "(II)I");
int result = (int) env->CallIntMethod(obj, mid, 10, 2);
// std::cout<
//常见类型转换例子
//String getInfo();
//-> ()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
(责任编辑:ioter)