A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、           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();

}

四、           整合第三方库到我们自己的库

待续

五、           调用多个第三方库

待续


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马