android之ndk开发

准备工作
1.下载安装Android NDK

 地址:http://developer.android.com/sdk/ndk/index.html
    配置NDK环境变量,如:
    NDK_HOME    C:\android-ndk-r9
    PATH        %NDK_HOME%


2.下载安装cygwin

 在window平台下,你要先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习       unix/linux操作环境,或者从unix到windows的应用程序移植,非常有用。通过它,你就可以在不安装linux的情况下使用NDK来编译C、C++代码了。
    下载地址:http://www.cygwin.com
    安装过程中在选择Select Packages时,只需选
    Devel: Install
    Shells:Install

    运行cygwin,在弹出的命令行窗口输入:cygcheck -c cygwin命令,会打印出当前cygwin的版本和运行状 态,如果  status是ok的话,则cygwin运行正常。


创建示例工程

//MainActivity.java
public class MainActivity extends Activity {
	// 1.定义一个c方法接口,相当于在java代码中定义一个接口
	private native String helloworldfromC();
	
	// 5.在java代码中引入函数库
	static{
		System.loadLibrary("hello"); // 注意:去掉前面的lib,和后面的.so
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	public void click(View view){
		Toast.makeText(this, helloworldfromC(), Toast.LENGTH_SHORT).show();
	}

}

工程下创建jni文件夹
文件夹内添加C文件和android.mk文件

// Hello.c
#include <stdio.h>
#include <jni.h>
// android-ndk-r9\android-ndk-r9\platforms\android-8\arch-arm\usr\include

// private native String helloworldfromC();
jstring Java_com_android_helloworldfromc_MainActivity_helloworldfromC(JNIEnv* env, jobject obj){

	// 2.实现c代码
	// 返回一个java的String
	// jstring     (*NewStringUTF)(JNIEnv*, const char*);
	// (*env) 相当于JNINativeInterface* JNIEnv
	// return (**env).NewStringUTF(env,"helloworldfromc");
	return (*env)->NewStringUTF(env,"helloworldfromc");

	// 生成mk文件
	// android.mk 告诉编译器如何把c代码打包成函数库

	// 3.把c代码打包成函数库
}

android.mk 如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# 打包成函数库的名字
LOCAL_MODULE    := hello
# 对应c代码文件
LOCAL_SRC_FILES := Hello.c

include $(BUILD_SHARED_LIBRARY)

编译c代码
cd 工程目录/
ndk-build
没有错误发生即是通过


运行程序注意: ndk工程只能运行于arm架构的模拟器


C文件中函数名的命名规范,如:
jstring   Java_com_android_helloworldfromc_MainActivity_helloworldfromC

返回值  Java_包名_类名_定义的c方法接口


这里也可以通过javah 自动生成头文件, 就不用自己写方法名
jdk 版本为1.6时
cd   工程目录\bin\classes
javah -classpath . com.android.helloworldfromc.MainActivity
注意: 这里务必标明路径为当前目录, 否则会出现找不到类的错误
因为它是通过相对路径找到你的类文件,如上,相对路径为:
.\com\anroid\hellowordfromc\MainActivity.java

所以,你也可以这样写
cd   工程目录\bin
javah -classpath .\classes com.android.helloworldfromc.MainActivity
会在bin目录内生成相应头文件

jdk 版本为1.7时
cd   工程目录\src
javah com.android.helloworldfromc.MainActivity


jni 常见的错误
    1 错误1  忘记方法的参数
    2 错误2  E/AndroidRuntime(821): java.lang.UnsatisfiedLinkError: Native method not found: com.example.error.DemoActivity.helloWorld:()Ljava/lang/String;
    3 错误3  一般没有日志打印 直接报错工程停止  一般c代码有运行错误
    4 错误4  在交叉编译的工具链上报错  c代码有编译错误  比如 一些函数没有声明  一些类型没有声明  少符号
    5 错误5  没有Android.mk 文件
    6 错误6  Android.mk 文件有错
    7 错误7  引用别人.so 函数库  需要你自己native方法对应类的包名 和之前打包成.so函数库的包名一致


示例工程下载


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。