Android的NDK学习1

http://blog.csdn.net/ownwell/article/details/8137376

首先我先给大家推荐一个很好的博客哦,这个是我无意间看到的~~

  我首先给大家带来的是一个Helloworld的程序。

   步骤会一步步贴图给出哦,至于现在的我会相信大家可以搞定的。

       1 确保你已经安装了NKD(我目前用的是NDK r4) 还有就是希望大家要记得在自己的Eclipse上安装CDT插件哦,另外在编译的过程中我们还要安装Cygwin的,还得在Cygwin中配置ndk4(下面用的$NDK4就是我们自己配置的)

       2 那就开始程序的开发了:

                  2.1    新建程序

                    新建一个Android程序叫HelloWorld。

                  

[html]  view plain copy print ?
  1. package com.example.helloworld;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.view.Menu;  
  6.   
  7. public class MainActivity extends Activity {  
  8.     public static native String getString();  
  9.       
  10.     static {  
  11.         System.loadLibrary("HelloWorld");  
  12.     }  
  13.   
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.     }  
  19.   
  20.     @Override  
  21.     public boolean onCreateOptionsMenu(Menu menu) {  
  22.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  23.         return true;  
  24.     }  
  25. }  
相信大家都只都这是干嘛的。

 

    2.2 开始编译生成头文件。

  看了很多帖子感觉有些帖子是转载的没有实际的自己的操作,我现在给大家一个很好用的方法:

    先打开自己的命令行吧,我的已经安装了Cygwin了有点linux的意思,呵呵,不过没关系。

  

   然后呢就可以看到在src下看到一个头文件了:

 

好了,这就搞定了第一步了

    2.3 开始编译so库了,所谓的so库就是动态的链接库,window下用的是dll,我们现在用的是android系统(其内核还是Linux的)。

    我们先得自己将我们刚才生成的.h头文件考到一个新建的jni的文件夹下,还得实现刚才的.h中的方法。

[html]  view plain copy print ?
  1. #include  "com_example_helloworld_MainActivity.h"  
  2.   
  3. JNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getString  
  4. (JNIEnv *env, jobject obj)  
  5. {  
  6.  char *str="Hello World";  
  7.  return (*env)->NewStringUTF(env,str);  
  8. }  


  另外我们还得自己写一个Android.mk文件就相当于Linux的makeFile:


[html]  view plain copy print ?
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE :HelloWorld  
  4. LOCAL_SRC_FILES :com_example_helloworld_MainActivity.c  
  5. include $(BUILD_SHARED_LIBRARY)  

这个.mk我解释一下

**************************************************************

local_path就是本地文件,地位到当前的文件夹

 $(CLEAR_VARS)  先clear下系统的变量

本地的模块(LOCAL_MODULE) HelloWorld就是我们要生成的so库的名字

包含的头文件(LOCAL_SRC_FILES) 就是我们自己写的源文件

*************************************************************

 在Cygwin下编译生成so库:



好吧在bin文件夹下看一下吧:


[html]  view plain copy print ?
  1.   
  有了so包了。

 我们还需要让这个字符显示出来哦,来一起改下activity的代码:

[html]  view plain copy print ?
  1. package com.example.helloworld;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.view.Menu;  
  6. import android.widget.TextView;  
  7.   
  8. public class MainActivity extends Activity {  
  9.     public static native String getString();  
  10.     private TextView helloText;  
  11.       
[html]  view plain copy print ?
  1.   
[html]  view plain copy print ?
  1.      //加载的HelloWolrd.so  
  2. tatic {  
  3. System.loadLibrary("HelloWorld");  
  4.   
  5.   
  6.   @Override  
  7.   public void onCreate(Bundle savedInstanceState) {  
  8.       super.onCreate(savedInstanceState);  
  9.       setContentView(R.layout.activity_main);  
  10.       findView();  
  11.   }  
[html]  view plain copy print ?
  1. //找到在layout下的xml布局中的textview  
  2.     private void findView() {  
  3.         helloText = (TextView)findViewById(R.id.hello);  
  4.         helloText.setText("JNIString  "+getString());  
  5.           
  6.     }  
  7.   
  8.     @Override  
  9.     public boolean onCreateOptionsMenu(Menu menu) {  
  10.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  11.         return true;  
  12.     }  
  13. }  



OK全部完成了。

附上代码


这是一个很小的demo,我们要实现的也很简单就是让JAVA层的能直接调用c层的实现,因为在很多的情况下我们需要通过c来直接调用系统的硬件的接口,其实我们对jni 的了解还是很少,我们就从android开始吧!

   hello-jniJava环境中的类MainActivity中声明的函数名为getString,前面要用到修饰符native,类HelloJni所在的包名为com.example.helloworld,需要用函数System.loadLibrary加载lib库HelloWorld.so,采用static修饰符确保只加载一次。然后按正常函数使用就行了。而在NDK这边,即C语言这层,函数命名要遵循Java___函数的命名方式,中间用下划线_进行连接,如上面所示,在包com.example.hellojni中的类HelloJni声明为stringFromJNI,则在C/C++文件中定义的函数名为JNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getString,注意区分大小写。函数可以传参数,本例子中没有传入参数,只是有返回参数,返回参数的数据类型为jstring,即Java中的String类型。对于C/C++中与上面的Java环境打交道的数据类型可以参照JNI,具体可访问官方网站http:// java.sun.com/docs/books/jni/。对于函数JNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getString中的两个参数envthiz是系统必须的,如果需要输入参数,必须再增加参数。


精品贴:

       讲到了c/c++的不同实现:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=180287

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值