1下载ndk包
将ndk的路径加入环境变量
3新建android工程
- activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="callJni"
android:text="callJni"
/>
</RelativeLayout>
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void callJni(View view) {
System.loadLibrary("helloaa");//加载so库,看后面解析
Toast.makeText(this,
stringFromC(), Toast.LENGTH_SHORT).show();
}
public native String stringFromC(); //声明为native方法(在c里面实现)
}
4 参考ndk目录里面的例子
所以我们也在项目里面创建jni文件夹、一个Android.mk文件、一个hello.c文件(如下图)
- 其中,hello.c文件如下
#include<stdio.h>
#include<stdlib.h>
#include<jni.h>
jstring Java_com_example_c1helloword_MainActivity_stringFromC(JNIEnv* env, jobject thiz) {
char * p = "c mothe kao";
return (*env)->NewStringUTF(env, p);
}
- Android.mk文件的代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloaa
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
5 打开cmd,进入该项目的根目录,然后输入:ndk-build 回车
6 查看所生成的so库
7 记得在调用native函数之前添加:
System.loadLibrary("helloaa"); //加载so库
8 可以run你的项目了
常见错误解决
c对应的native函数名写错?
*solution:通过javah 来生成对应的c的函数名
can’t find library
*可能原因有2个:①System.loadLibrary(“helloaa”); //加载的so库 名字写错;②编译的so平台和实际运行的cpu架构不一致。
*solution:①改正so库的名字; ②如下图
然后run你的project