运行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