安卓NDK开发入门DEMO

来源:互联网 发布:如何找回域名密码 编辑:程序博客网 时间:2024/05/10 06:31

网上很多关于安卓使用jni调用c的例子,比较杂乱,有的还是使用cygwin,今天小弟来总结一下,直接用安卓的ndk来生成.so文件.不用不足之处敬请指出.

,材料:

  Eclipse,Android SDK,jdk,ADT,Android NDK

  以上比较难下到的应该是ndk了:

  windows32位,360云盘: http://yunpan.cn/cQjZSsnWJbawx  访问密码 292b

  windows64位,百度云盘: http://pan.baidu.com/s/1i3H42JN  访问密码 59eh


  ndk下载完毕后,双击解压


 


二,环境变量配置:

  1,安卓各种环境配置

  2,环境变量path追加:     ;D:\rar\android-ndk-r10d(解压出来的路径)


三,配置ndk到Eclipse

  1,选择Android>NDK,将刚才解压出的文件选中

 


 2,新建一个普通的安卓项目,到刚才解压后的ndk文件夹下把samples\hello-jni\jni考到此项目中,并把Android.mk,Application.mk以外的文件删掉.

 Android.mk是关联java和c层的文件,Application.mk用来配置根据不同cpu生成不同.so文件

 

    


3,配置javaH,配置完成后可以直接在Eclipse里生成头文件,而不必再进到命令行里敲各种命令了.

 依次点击:Run>External Tools>External Tools Configurations ,来到配置面板

 



配置生成头文件的执行命令:

1,点击新建,Name里输入javaH,也可以是其他名字;

2,Location选择中间那个Browse File System,把当前jdk\bin\javah.exe选中;

3,Work Directory:单击Variables,选中project_loc,并在后面加上\src

4,Arguments:输入:

    -classpath ${project_loc}\bin\classes;F:\new_fila\sdk\platforms\android-20\android.jar -d ${project_loc}\jni-jni ${java_type_name}

    -classpath 后面接的是.class的路径,注意"F:\new_fila\sdk\platforms\android-20\android.jar"为当前安卓SDK的android.jar路径,platforms下随便一个版本都行.如果不加,当目标类里有引用安卓包时,在生成头文件时会报找不到安卓的类,如"找不到......Activity";

    -d 后面接的是你要把生成的.h文件放在哪个路径下

    -jni 后面接目标类

    这些其实会转化为一条javah命令


按图勾选:


按图勾选:




4,配置ndk-build命令,配置完成后可以在Eclipse里点击按钮来生成.so,不必再进命令行里操作了:

类似上面的方式,此处Location选取ndk的ndk-build.cmd



5,编写本地方法,如:

package com.example.ndk_demo;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class MainActivity extends Activity {public static native String getStringFromC();        TextView showMessage;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);showMessage = (TextView) findViewById(R.id.tv_show_ndk);findViewById(R.id.button1).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {showMessage.setText(getStringFromC());}});}}


6,生成头文件,依次单击:目标类>Run工具>javaH(刚才配置的)




刷新项目,在jni文件夹下,生成了.h文件:




7,在jni文件夹下,新建demo.c,实现本地方法

#include <string.h>#include <jni.h>#include "com_example_ndk_demo_MainActivity.h"//把头文件导入//把刚才头文件里的方法直接拷贝过来,并实现,//注意此处多了一个"1",我删除后,发现运行报错:找不到本地方法,所以我建议直接拷贝处理 JNIEXPORT jstring JNICALL Java_com_example_ndk_1demo_MainActivity_getStringFromC( JNIEnv* env,  jobject thiz ){ return (*env)->NewStringUTF(env, "Hello from JNI ! ");}



8,修改Android.mk,此处的demo即将要生成的.so的名字,最终将使是"libdemo.so",demo.c则是c文件

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := demoLOCAL_SRC_FILES := demo.cinclude $(BUILD_SHARED_LIBRARY)



9,执行ndk-build,依次单击:项目>Run工具>ndk-build(刚才配置的)



10,生成.so文件,其路径为obj




四,调用,demo里就是一个按钮点击后,textview显示一个字符串,此字符串来自.so文件:

package com.example.ndk_demo;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class MainActivity extends Activity {        //导入本地文件static {System.loadLibrary("demo");}public static native String getStringFromC();TextView showMessage;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);showMessage = (TextView) findViewById(R.id.tv_show_ndk);findViewById(R.id.button1).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {showMessage.setText(getStringFromC());}});}}


效果:

 



至此,实现了简单的ndk开发!











0 0