使用jni实现Java调用C代码,步骤:
1,下载ndk,链接:http://developer.android.com/tools/sdk/ndk/index.html;解压 ,
2,如果是windows系统,需要安装Cygwin工具,这是window下模拟Linux编译环境的工具(因为Android内核就是Linux);如果windows系统的同学就去找安装这个工具的教程;
3,如果是Linux系统或者mac系统,就直接配置NDK环境变量(我是mac系统,在这里就介绍mac系统的了),和配置adb环境变量一样,将ndk解压路劲加入到环境变量文件中,然后在终端中就可以直接编译了;
4,创建一个Android project,在.java文件中定义一个native方法:
public native String fromeC();
5,在项目根目录下创建一个jni文件夹,在这个文件夹下创建一个.c文件,用来实现我们定义的native方法;代码如下:
#include <jni.h>
#include <stdio.h>
/*
* 把Java的方法跟C的方法做个对应,一定要符合这些命名规则,才能java才能找到对应的c代码
* type:Java
* PackageName:com_baiyou_mp3ecode 这个类所在的包
* ClassName: JNIMp3Encode native方法所在的类
* MethodName: fromC
* obj:代表调用C代码的Java对象
*/
jstring Java_com_baiyou_mp3ecode_JNIMp3Encode_fromC
(JNIEnv *env, jobject obj)
{
//c代码
char* cstr = "hello from c";
return (**env).NewStringUTF(env,cstr);
}
/*
* type:Java
* Package:com_baiyou_mp3ecode
* Class: JNIMp3Encode
* Method: destroy
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_baiyou_mp3ecode_JNIMp3Encode_destroy
(JNIEnv *env, jobject obj)
{
lame_close(lame);
}
6,在jni目录下创建Android.mk文件,定义一些规范:代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#编译后的c可执行性文件叫啥名
LOCAL_MODULE := JNIMp3Encode
#需要被编译的C源文件
LOCAL_SRC_FILES :=JNIMp3Encode.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
7,打开终端,切换到jni目录下编译.c文件,键入 ndk-build ;
8,编译完成之后,在根目录会生成libs文件夹,里面的armeabi子文件夹中会有JNIMp3Encode.so 库。
9,在JNIMp3Encode定义了native方法的类中,用静态代码块加入.so类库:如下:
public native String fromeC();;
static{
System.loadLibrary("JNIMp3Encode");//这个名字要和在Android.mk文件中定义的LOCAL_MODULE := JNIMp3Encode这个名字一样
}
10,然后在其他.java文件中就可以调用fromeC();这个本地方法了;
来源:oschina
链接:https://my.oschina.net/u/936286/blog/189907