android ndk开发

Android Studio版本:release 1.0.2

创建一个空的project。创建一个空的activity。

在该类里面定义一个native方法。如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public native String getStringFromNative();  

然后make project一下,目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。

点开android studio 的Terminal标签页,默认进入到该项目的app文件夹下。如果在该目录下输入cd  src\main  切换到main目录下。

我的路径为:

E:\work\android\MyJNIDemo\app\src\main>

用javah生成c的头文件:

javah -d jni -classpath D:\androidsdk\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.jnimobile.www.myjnidemo.MainActivity

就会发现在main目录下多了一个jni文件夹,里面有生成好的头文件:com_jnimobile_www_myjnidemo_MainActivity.h

内容如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_jnimobile_www_myjnidemo_MainActivity */  
  4.   
  5. #ifndef _Included_com_jnimobile_www_myjnidemo_MainActivity  
  6. #define _Included_com_jnimobile_www_myjnidemo_MainActivity  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_ABOVE_CLIENT  
  11. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_ABOVE_CLIENT 8L  
  12. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_ADJUST_WITH_ACTIVITY  
  13. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L  
  14. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT  
  15. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L  
  16. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_AUTO_CREATE  
  17. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_AUTO_CREATE 1L  
  18. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_DEBUG_UNBIND  
  19. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_DEBUG_UNBIND 2L  
  20. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_IMPORTANT  
  21. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_IMPORTANT 64L  
  22. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_NOT_FOREGROUND  
  23. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_NOT_FOREGROUND 4L  
  24. #undef com_jnimobile_www_myjnidemo_MainActivity_BIND_WAIVE_PRIORITY  
  25. #define com_jnimobile_www_myjnidemo_MainActivity_BIND_WAIVE_PRIORITY 32L  
  26. #undef com_jnimobile_www_myjnidemo_MainActivity_CONTEXT_IGNORE_SECURITY  
  27. #define com_jnimobile_www_myjnidemo_MainActivity_CONTEXT_IGNORE_SECURITY 2L  
  28. #undef com_jnimobile_www_myjnidemo_MainActivity_CONTEXT_INCLUDE_CODE  
  29. #define com_jnimobile_www_myjnidemo_MainActivity_CONTEXT_INCLUDE_CODE 1L  
  30. #undef com_jnimobile_www_myjnidemo_MainActivity_CONTEXT_RESTRICTED  
  31. #define com_jnimobile_www_myjnidemo_MainActivity_CONTEXT_RESTRICTED 4L  
  32. #undef com_jnimobile_www_myjnidemo_MainActivity_MODE_APPEND  
  33. #define com_jnimobile_www_myjnidemo_MainActivity_MODE_APPEND 32768L  
  34. #undef com_jnimobile_www_myjnidemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING  
  35. #define com_jnimobile_www_myjnidemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L  
  36. #undef com_jnimobile_www_myjnidemo_MainActivity_MODE_MULTI_PROCESS  
  37. #define com_jnimobile_www_myjnidemo_MainActivity_MODE_MULTI_PROCESS 4L  
  38. #undef com_jnimobile_www_myjnidemo_MainActivity_MODE_PRIVATE  
  39. #define com_jnimobile_www_myjnidemo_MainActivity_MODE_PRIVATE 0L  
  40. #undef com_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_READABLE  
  41. #define com_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_READABLE 1L  
  42. #undef com_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_WRITEABLE  
  43. #define com_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_WRITEABLE 2L  
  44. #undef com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DIALER  
  45. #define com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DIALER 1L  
  46. #undef com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DISABLE  
  47. #define com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DISABLE 0L  
  48. #undef com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL  
  49. #define com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L  
  50. #undef com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL  
  51. #define com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L  
  52. #undef com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SHORTCUT  
  53. #define com_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SHORTCUT 2L  
  54. #undef com_jnimobile_www_myjnidemo_MainActivity_RESULT_CANCELED  
  55. #define com_jnimobile_www_myjnidemo_MainActivity_RESULT_CANCELED 0L  
  56. #undef com_jnimobile_www_myjnidemo_MainActivity_RESULT_FIRST_USER  
  57. #define com_jnimobile_www_myjnidemo_MainActivity_RESULT_FIRST_USER 1L  
  58. #undef com_jnimobile_www_myjnidemo_MainActivity_RESULT_OK  
  59. #define com_jnimobile_www_myjnidemo_MainActivity_RESULT_OK -1L  
  60. /* 
  61.  * Class:     com_jnimobile_www_myjnidemo_MainActivity 
  62.  * Method:    getStringFromNative 
  63.  * Signature: ()Ljava/lang/String; 
  64.  */  
  65. JNIEXPORT jstring JNICALL Java_com_jnimobile_www_myjnidemo_MainActivity_getStringFromNative  
  66.   (JNIEnv *, jobject);  
  67.   
  68. #ifdef __cplusplus  
  69. }  
  70. #endif  
  71. #endif  

在jni目录下新建一个 .c文件。来实现头文件里面声明的方法。我的叫main.c

内容如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "com_jnimobile_www_myjnidemo_MainActivity.h"  
  2. /* 
  3.  * Class:     com_jnimobile_www_myjnidemo_MainActivity 
  4.  * Method:    getStringFromNative 
  5.  * Signature: ()Ljava/lang/String; 
  6.  */  
  7. JNIEXPORT jstring JNICALL Java_com_jnimobile_www_myjnidemo_MainActivity_getStringFromNative  
  8.   (JNIEnv * env, jobject obj){  
  9.      return (*env)->NewStringUTF(env,"I'm comes from to Native Function!");  
  10.   }  

在jni下面再建一个空的.c文件。要不编译有问题,这个应该是android studio的一个bug。


在 local.properties 文件中设置ndk的路径:

我的是:

ndk.dir=D\:\\android-ndk-r10d

该文件的完整的配置信息如下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. sdk.dir=D\:\\androidsdk  
  2. ndk.dir=D\:\\android-ndk-r10d  


在app目录下的 build.gradle中设置库文件名(生成的so文件名):

找到 defaultConfig 这项,在里面添加如下内容:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ndk{  
  2.             moduleName "MyJni"  //设置库(so)文件名称  
  3.         }  

在activity中添加一个TextView以便显示从native方法中获取的字符信息(修改对应的布局文件添加一个TextView,并设定其ID值)。

在activity中增加对so的加载:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static {  
  2.     System.loadLibrary("MyJni");  
  3. }  

activity的完整代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.jnimobile.www.myjnidemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.TextView;  
  6.   
  7.   
  8. public class MainActivity extends Activity {  
  9.     private TextView tv=null;  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_main);  
  14.         tv=(TextView)findViewById(R.id.tv);  
  15.         tv.setText(getStringFromNative());  
  16.     }  
  17.   
  18.     public native String getStringFromNative();  
  19.   
  20.   
  21.     static {  
  22.         System.loadLibrary("MyJni");  
  23.     }  
  24. }  

编译,并运行。界面上就会显示从native方法传过来的值。

项目目录截图如下:

这个是运行在模拟器上的截图:

 


文章转自 http://blog.csdn.net/rznice/article/details/42295215


需要注意一下的是javah命令要写对,不然生成不了jni目录和文件,我测试用的命令如下,android.jar后面是分号,debug/后面有空格,后面是包名加activity。生成的库位于app/build/intermediates/ndk/arm/debug/lib/armeabi-v7a/下面

javah -d jni -classpath D:/android_sdk/platforms/android-21/android.jar;../../build/intermediates/classes/debug/ liyang.com.myapptest.JniTestActivity


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值