运行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();
}
}
// 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代码打包成函数库
}LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 打包成函数库的名字 LOCAL_MODULE := hello # 对应c代码文件 LOCAL_SRC_FILES := Hello.c include $(BUILD_SHARED_LIBRARY)
运行程序注意: 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函数库的包名一致
原文地址:http://blog.csdn.net/cy524563/article/details/41786643