一、 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(); } 四、 整合第三方库到我们自己的库 待续 五、 调用多个第三方库 待续
|