android java和c混合编程_C/C++ 在 Java 项目、Android 和 Objective-C 三大平台下实现混合编程...

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++项目

6982f08a8cd698e5c13b0cc69c9d95f1.png

1c451f0176ed0cf2f69a0e70fef7ee24.png

第二步:关联JavaVM的Framework

路径:

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

1e93c64d715827ca0c984f215f5f5bba.png

第三步:创建头文件,用于和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).

编译后文件

c5bd0ebcb09d7b850cd514c54e6d73c8.png

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

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

(责任编辑:ioter)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值