Eclipse下创建jni

来源:互联网 发布:零一数据分析 编辑:程序博客网 时间:2024/05/19 23:57

 Eclipse下创建jni文件

         之前自己有看了很多的关于ndk的相关论坛,但终究看的云里雾里.这次经过自己的使用和研究,大致知道了eclipse项目中生成ndk的步骤及需要注意的几个地方.

这里我就以一个简单的案例来说明eclipse下生成jni的相关流程.

1.建立一个新工程,只有一个MainActivity,里面加载库文件并且调用若干本地方法,然后使用javah生成对应的.h文件.(主要需要注意的是里面的native静态方法)

      package com.example.alldemo;
      import android.app.Activity;
      import android.os.Bundle;
      import android.widget.TextView;
     public class MainActivity extends Activity {
private TextView tv;
public static native String getStringFromJni();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv=(TextView) findViewById(R.id.tv);
        tv.setText(getStringFromJni());
    }
}

2.切换到项目下,使用javah -classpath bin/classes -d jni com.example.alldemo.MainActivity,如果发现找不到android.app.Activity的类文件.

这是因为没有加载android.jar文件.这时候需要切换到android.jar加载android.jar文件.这时候需要用到的指令如下:

javah -classpath bin/classes;F:\sdk\platforms\android-20\android.jar  -d jni com.example.alldemo.MainActivity


加载android.jar包之后再执行javah指令


可以看到我们的jni文件夹下面已经成功生成了.h文件


到这里,生成.h文件的步骤已经完成.另外需要注意,在android stuido下面需要使用javah -d jni -classpath ./java activity.msd.com.jnidemo.MainActivity生成.h文件

   3.在jni文件夹下面,自己新建一个File.这个.c文件名称可以自己命名.这里我命名为test.c文件..c文件需要声明一些头文件.表示该文件符合C语法.

#include<stdio.h>
#include<stdlib.h>
#include <jni.h>
#include <string.h>
#include "com_example_alldemo_MainActivity.h" //这个表示需要引入的c文件是那个文件.这个就是我们的刚生成的.h文件.


 4.引入这些头文件之后,这时候就需要将com_example_alldemo_MainActivity.h里面的声明的方法复制到testJni.c文件里面并实现它.



这里表示的是返回一个字符串.至此,.c文件就已经好了.

5.接着我们就需要配置Android.mk文件了.我这个android.mk文件是从其他项目复制过来的,这里我只说下需要修改的两个地方.

其中LOCAL_MODULE表示的是生成的so库名称,这个可以自己命名,LOCAL_SRC_FILES表示需要引入的.c文件.也就是我们刚自己新创建的c文件.修改完这两个地方就已经配置好Android.mk文件了.


6.打开cygwin控制台,切换到项目根目录下面,使用$ndk/ndk-build指令生成.so库文件.cygwin的配置网上有很多教程,这里我就不再去详述了.


这时可以查看lib目录下面多了个个armeabi文件,里面就有我们的生成的so文件.


7.现在我们就可以在项目中使用我们的so库了.在MainActivity中加入一句静态代码块,使用System.loadLibrary加载我们的so库文件.

static{
System.loadLibrary("ndk_mode");
}

loadLibrary里面的so库名称就是我们在Androd.mk里面自定义的名字

调用so库之后的MainActivity文件结构.运行之后会在我们的界面上显示个test


原创粉丝点击