AndroidStudio版本:release 1.0.2

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

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

[java] view plain copy
  1. publicnativeStringgetStringFromNative();

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

点开androidstudio的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
  1. /*DONOTEDITTHISFILE-itismachinegenerated*/
  2. #include<jni.h>
  3. /*Headerforclasscom_jnimobile_www_myjnidemo_MainActivity*/
  4. #ifndef_Included_com_jnimobile_www_myjnidemo_MainActivity
  5. #define_Included_com_jnimobile_www_myjnidemo_MainActivity
  6. #ifdef__cplusplus
  7. extern"C"{
  8. #endif
  9. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_ABOVE_CLIENT
  10. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_ABOVE_CLIENT8L
  11. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_ADJUST_WITH_ACTIVITY
  12. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_ADJUST_WITH_ACTIVITY128L
  13. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
  14. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_ALLOW_OOM_MANAGEMENT16L
  15. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_AUTO_CREATE
  16. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_AUTO_CREATE1L
  17. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_DEBUG_UNBIND
  18. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_DEBUG_UNBIND2L
  19. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_IMPORTANT
  20. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_IMPORTANT64L
  21. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_NOT_FOREGROUND
  22. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_NOT_FOREGROUND4L
  23. #undefcom_jnimobile_www_myjnidemo_MainActivity_BIND_WAIVE_PRIORITY
  24. #definecom_jnimobile_www_myjnidemo_MainActivity_BIND_WAIVE_PRIORITY32L
  25. #undefcom_jnimobile_www_myjnidemo_MainActivity_CONTEXT_IGNORE_SECURITY
  26. #definecom_jnimobile_www_myjnidemo_MainActivity_CONTEXT_IGNORE_SECURITY2L
  27. #undefcom_jnimobile_www_myjnidemo_MainActivity_CONTEXT_INCLUDE_CODE
  28. #definecom_jnimobile_www_myjnidemo_MainActivity_CONTEXT_INCLUDE_CODE1L
  29. #undefcom_jnimobile_www_myjnidemo_MainActivity_CONTEXT_RESTRICTED
  30. #definecom_jnimobile_www_myjnidemo_MainActivity_CONTEXT_RESTRICTED4L
  31. #undefcom_jnimobile_www_myjnidemo_MainActivity_MODE_APPEND
  32. #definecom_jnimobile_www_myjnidemo_MainActivity_MODE_APPEND32768L
  33. #undefcom_jnimobile_www_myjnidemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
  34. #definecom_jnimobile_www_myjnidemo_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING8L
  35. #undefcom_jnimobile_www_myjnidemo_MainActivity_MODE_MULTI_PROCESS
  36. #definecom_jnimobile_www_myjnidemo_MainActivity_MODE_MULTI_PROCESS4L
  37. #undefcom_jnimobile_www_myjnidemo_MainActivity_MODE_PRIVATE
  38. #definecom_jnimobile_www_myjnidemo_MainActivity_MODE_PRIVATE0L
  39. #undefcom_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_READABLE
  40. #definecom_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_READABLE1L
  41. #undefcom_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_WRITEABLE
  42. #definecom_jnimobile_www_myjnidemo_MainActivity_MODE_WORLD_WRITEABLE2L
  43. #undefcom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DIALER
  44. #definecom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DIALER1L
  45. #undefcom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DISABLE
  46. #definecom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_DISABLE0L
  47. #undefcom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
  48. #definecom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL4L
  49. #undefcom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
  50. #definecom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL3L
  51. #undefcom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SHORTCUT
  52. #definecom_jnimobile_www_myjnidemo_MainActivity_DEFAULT_KEYS_SHORTCUT2L
  53. #undefcom_jnimobile_www_myjnidemo_MainActivity_RESULT_CANCELED
  54. #definecom_jnimobile_www_myjnidemo_MainActivity_RESULT_CANCELED0L
  55. #undefcom_jnimobile_www_myjnidemo_MainActivity_RESULT_FIRST_USER
  56. #definecom_jnimobile_www_myjnidemo_MainActivity_RESULT_FIRST_USER1L
  57. #undefcom_jnimobile_www_myjnidemo_MainActivity_RESULT_OK
  58. #definecom_jnimobile_www_myjnidemo_MainActivity_RESULT_OK-1L
  59. /*
  60. *Class:com_jnimobile_www_myjnidemo_MainActivity
  61. *Method:getStringFromNative
  62. *Signature:()Ljava/lang/String;
  63. */
  64. JNIEXPORTjstringJNICALLJava_com_jnimobile_www_myjnidemo_MainActivity_getStringFromNative
  65. (JNIEnv*,jobject);
  66. #ifdef__cplusplus
  67. }
  68. #endif
  69. #endif

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

内容如下:

[cpp] view plain copy
  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. JNIEXPORTjstringJNICALLJava_com_jnimobile_www_myjnidemo_MainActivity_getStringFromNative
  8. (JNIEnv*env,jobjectobj){
  9. return(*env)->NewStringUTF(env,"I'mcomesfromtoNativeFunction!");
  10. }

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


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

我的是:

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

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

[cpp] view plain copy
  1. sdk.dir=D\:\\androidsdk
  2. ndk.dir=D\:\\android-ndk-r10d


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

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

[java] view plain copy
  1. ndk{
  2. moduleName"MyJni"//设置库(so)文件名称
  3. }

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

在activity中增加对so的加载:

[java] view plain copy
  1. static{
  2. System.loadLibrary("MyJni");
  3. }

activity的完整代码如下:

[java] view plain copy
  1. packagecom.jnimobile.www.myjnidemo;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.widget.TextView;
  5. publicclassMainActivityextendsActivity{
  6. privateTextViewtv=null;
  7. @Override
  8. protectedvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. tv=(TextView)findViewById(R.id.tv);
  12. tv.setText(getStringFromNative());
  13. }
  14. publicnativeStringgetStringFromNative();
  15. static{
  16. System.loadLibrary("MyJni");
  17. }
  18. }

编译,并运行。界面上就会显示从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


更多相关文章

  1. Android文件关联
  2. Android(安卓)tips2
  3. Android(安卓)Studio中集成OpenCV——只需4步
  4. Java編程和Android編程的區別
  5. 简单的 Android(安卓)拍照并显示以及获取路径后上传
  6. Android(安卓)Studio初步使用及HelloWorld详解
  7. android中常见的错误及解决办法
  8. 使用Android(安卓)Studio打包指定名称的Apk
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android中利用SpannableString实现点击同
  2. Android MediaPlayer 设置音轨
  3. Android setting各子页面地址
  4. Android中使用am命令实现在命令行启动程
  5. android 介绍Retrofit的简单使用
  6. android 理解Fragment生命周期
  7. android下高效率的J2ME API之Graphics.dr
  8. Android数据存储(3)SQLite简介和简单的登
  9. Android 性能优化 四 布局优化merge标签
  10. 【android】SQLite数据库之SQLiteOpenHel