android调用c++

From:http://blog.youkuaiyun.com/jjdujiang/article/details/53158045

1:下载ndk,本人下载的是64位Android-ndk-r10,设置ndk的环境变量NDK_HOME=E:\Software\Android\android-ndk32-r10-windows-x86_64\android-ndk-r10,另外再添加PATH环境变量同NDK_HOME一样的,cmd查看ndk-build的版本信息 ndk-build -version。

2:在adt的eclipse中设置NDK路径,菜单window-preferences-android-ndk-ndk location就是上面提到的NDK_HOME目录。

3:添加工程的本地支持,右键-android tools-add native support,命名例如TestNative,会自动生成一个jni文件夹,里面有两个文件,Android.mk,TestNative.cpp。

4:C++编译设置项目右键-properties-c/c++ build,设置build command =${NDK_HOME}/ndk-build.cmd,就是NDK_HOMD下的命令文件ndk-build.cmd,当然use default build command不要选。

5:新建类,例如TestNative,代码如下

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Courier New;font-size:18px;">public class TestNative {  
  2.     static   
  3.     {   
  4.         System.loadLibrary("TestNative");   
  5.     }  
  6.       
  7.     public native int add(int i, int j);  
  8. }  
  9. </span>  

6:用javah,利用cmd cd进入到项目com目录的上一层src,输入命令javah -classpath . -jni com.example.***.TestNative2,回车,就会看见src目录下多一个头文件com_example_hheas_TestNative2,将该文件拷贝到jni目录下。

该方法每次都要重新设置,不方便,可以用工具

External Tools Configurations,左边Program右键new,例如命名javahForAndroidProject,

Location设置为:${system_path:javah}

Working Directory设置为:${project_loc}

Arguments设置为:-v -classpath "${project_loc}/bin/classes" -d "${project_loc}/jni" ${java_type_name}

应用之后,Organize Favorites,Add,选择刚才新建的工具javahForAndroidProject,OK。

以后文件重新编辑之后,只要点击那个工具javahForAndroidProject,选中jni重新刷新F5就可以了。

7:在TestNative.cpp中实现,

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="font-family:Courier New;font-size:18px;">#include <jni.h>  
  2.   
  3. #include "com_example_hheas_TestNative.h"  
  4. #include "com_example_hheas_TestNative2.h"  
  5.   
  6. #ifdef __cplusplus  
  7. extern "C" {  
  8. #endif  
  9. /* 
  10.  * Class:     com_example_hheas_TestNative 
  11.  * Method:    add 
  12.  * Signature: (II)I 
  13.  */  
  14. JNIEXPORT jint JNICALL Java_com_example_hheas_TestNative_add  
  15.   (JNIEnv *, jobject, jint i, jint j) {  
  16.     return i + j;  
  17. }  
  18.   
  19. JNIEXPORT jint JNICALL Java_com_example_hheas_TestNative2_multiply  
  20.   (JNIEnv *, jobject, jint i, jint j) {  
  21.     return i * j;  
  22. }  
  23.   
  24. #ifdef __cplusplus  
  25. }  
  26. #endif  
  27. </span>  

如果头文件是C规则的话,源文件要加extern "C"一定要注意!

8:项目libs目录下会找到刚才生成的库文件libTestNative.so

9:注意C和C++还是有区别的,例如

C++中用:

return env->NewStringUTF( "Hello from JNI !  Compiled with ABI ");

注意:只有一个参数!!

C中用:

return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI ");

注意:有两个参数!!

10:还要新建Application.mk文件

例如支持stl什么的,平台什么的

APP_STL := stlport_static
APP_STL := gnustl_static
APP_ABI := all

APP_PLATFORM := android-14

上面第四句话是调试C++用到的。

11:调试C++,工程右键-Properties-c/c++ Build,Build command处添加NDK_DEBUG=1,即重新改写为

${NDK_HOME}/ndk-build.cmd NDK_DEBUG=1

常见错误

APP_PLATFORM android-19 is larger than android:minSdkVersion 14

反正是版本不对的意思,在Application.mk中添加APP_PLATFORM := android-14。

Unable to launch cygpath. Is Cygwin on the path?

添加NDKROOT 设置为本地ndk目录

工程右键-Properties-c/c++ Build-Environment-Add

例如E:\Software\Android\android-ndk32-r10-windows-x86_64\android-ndk-r10

12:还有一步,本人在重新按照此步骤时,出现jint无法识别的问题,需要设置C/C++头文件路径的,项目右键Properties-c/c++ General-Path and Symbols右边Include Add 添加路径E:\Software\Android\android-ndk32-r10-windows-x86_64\android-ndk-r10\platforms\android-14\arch-arm\usr\include,上面是本人的路径,依实际情况而变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值