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