1.下载NDK
2.解压到相应目录
3.新建项目并建立jni文件
4.配置NDK-build相关环境(由于目前版本ndk已经集成了NDK-build,因此不需要再linux模拟环境下运行)
- 1
- 2
3
4
- 5
完成
hello world 程序
1.定义函数
public native String helloWorldFromC();
2.jni下建立hello.c 【要实现c代码所在的文件】
#include <stdio.h> #include <jni.h> jstring Java_com_example_ndkhelloworld_MainActivity_helloWorldFromC(JNIEnv* env,jobject obj) { return (*env)->NewStringUTF(env,"helloworldFormC"); }
变量类型符合jni规范,具体可取ndk里面查看jni.h文件
- 函数名java_包名类名函数名。 中间的.改为_
- *env执行JNIEnv
- *JNIEnv执行一个结构体
- 结构体下定义了一个NewStringUT生成一个jString字符串
- 两个参数 一个是env,一个是*char即字符串就行。
- 也可在对应目录下使用javah com.example.ndkhelloworld.MainActivity 生成头文件。
3.jni下建立Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY)
*LOCAL_SRC_FILES为c源文件这里即上面实现的hello.c
*LOCAL_MODULE生成的包文件 可以任意取。4.chean下project则会自动编译,因为在配置build的时候勾选了。 编译完成后在libs下生成libhello.so文件
5.load相关包。这里LoadLibrary里面的字符串必须和Android.mk LOCAL_MODULE后面一致
6运行程序 这里必须使用 ARM为cup的模拟器。x86的不行。x86为windows上的。不能再linux上跑。所以使用ARM手机的cpu的模拟器
代码
MainActivity.java
package com.example.ndkhelloworld;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
public native String helloWorldFromC();
static{
System.loadLibrary("hello");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(helloWorldFromC());
}
}
hello.c
#include <stdio.h>
#include <jni.h>
jstring Java_com_example_ndkhelloworld_MainActivity_helloWorldFromC
(JNIEnv* env,jobject obj){
return (*env)->NewStringUTF(env,"helloworldFormC");
}
jni常见错误
- 未加参数
- 链接错误, 方法名出错
- log未打印任何信息 一般是c语言运行错误。
- 编译时报错, 则是c代码有编译错误。
- 没有Android.mk 文件
- Android.mk 文件有错
- 引用别人.so 函数库 需要你自己native方法对应类的包名 和之前打包成.so函数库的包名一致
Android.mk
- LOCAL_PATH := $(call my-dir) // 返回当前c代码目录
- include $(CLEAR_VARS) // 清除了所有 已local 开头的配置文件 唯独不清除LOCAL_PATH
- LOCAL_MODULE := hello // 库函数的名字 严格遵守makefile 格式 lib .so
- LOCAL_SRC_FILES := Hello.c
- include $(BUILD_SHARED_LIBRARY) //加入库函数