一、 Eclipse配置
1. Eclipse整合javah
注意:每次执行前,光标定位到当前java文件内。如果配置不成功,clean一下当前工程,如果执行不成功,看有没有输错,windows和Linux的不同,请先确保在CMD下手动输入能执行成功。
2. 修改项目的编译选项
项目右击->Properties->C/C++ Build->Buildcommand中填写你的android-ndk的根目录。
编译项目,项目右键->build project,会看到控制台输出,说明我们是正确的。
3. 安装ndk
二、 编写libhello.so库
1. 新建工程JNITest2,编写HelloActivity.java,这个作为上层,调用本地库hello的sayHello函数。
public class HelloActivity extends Activity {
static{
System.loadLibrary("hello");//加载库
}
private staticnativeString sayHello();//本地库文件
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AlertDialog.Builder(this).setMessage(sayHello()).show();
}
}
2. 生成头文件并编写本地库
项目右键->Android Tools->Add Native Support->填写生成库的名称hello。会生成jni文件夹,里面有hello.cpp和Android.mk文件。点击“run javah”按钮生成头文件。
编写hello.cpp文件,头文件的方法名要跟本地代码hello.cpp的方法名一致才能被调用。
JNIEXPORTjstringJNICALL Java_com_jsr_jnitest2_HelloActivity_sayHello
(JNIEnv *env, jclass){
return env->NewStringUTF("hello");
}
jint JNI_OnLoad(JavaVM* vm,void* reserved){
JNIEnv* env = NULL;
jint result = -1;
if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){
return result;
}
return JNI_VERSION_1_4;
}
3. 编写Android.mk文件
由于采用eclipse直接生成,所以不必写。
4. 编译项目,项目右击->build project,然后运行android项目。
5. 关系图
三、 编写android程序调用libhello.so库
有时我们在开发的时候,只有其他公司给的库文件让我们自己开发。这时候就需要我们会调用它。假设我们现在只获得libhello.so库还有文档还有头文件。
首先新建一个工程,然后把该库导入“lib/armeabi”文件夹里。观察文档和头文件里的方法名:
JNIEXPORT jstring JNICALL Java_com_jsr_jnitest2_HelloActivity_sayHello
(JNIEnv *, jclass);
改方法可以看出,返回值类型为string,包名为com.jsr.jnitest2,程序名为HelloActivity,方法名为sayHello。根据上面可以恢复包名类名,然后就可以调用。
1. 将libhello.so导入lib/armeabi文件夹里。
2. 根据头文件或者文档的方法名重构工程的包名类名。
3. 调用方法。
static{
System.loadLibrary("hello");
}
private static native String sayHello();
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, sayHello(), 0).show();
}
四、 整合第三方库到我们自己的库
待续
五、 调用多个第三方库
待续