安卓NDK开发入门DEMO

网上很多关于安卓使用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;

	@Override
	protected 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() {

			@Override
			public 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    := demo
LOCAL_SRC_FILES := demo.c

include $(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;

	@Override
	protected 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() {

			@Override
			public void onClick(View arg0) {
				showMessage.setText(getStringFromC());
			}
		});
	}

}


效果:

 



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











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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值