JNI由浅入深_3_Hello World

来源:互联网 发布:centos命令大全 chm 编辑:程序博客网 时间:2024/06/10 07:53

1、需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk.

  在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同.

  : ${ORIGINAL_PATH=${PATH}}  if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then    PATH="/usr/local/bin:/cygdrive/d/cgwin/android-ndk-r7b:/usr/bin${PATH:+:${PATH}}"  else    PATH="/usr/local/bin:/usr/bin:/cygdrive/d/cgwin/android-ndk-r7b"  fi

2、开发步骤:

a.创建一个android工程b.JAVA代码中写声明 native 方法 public native String helloFromJNI(); 通过javah  包名.类名生成jni的方法签名c. 创建jni目录,编写c代码,方法名字要对应。或者将生成的签名文件拷贝到jni目录,然后在c代码中引入。d.编写Android.mk文件e.Ndk编译生成动态库( ndk -build )f.Java代码load 动态库.调用native代码

  2.1 创建一个Android项目,创建native方法.

public class MainActivity extends Activity {    static{        //加载二进制文件        System.loadLibrary("Hello");//libHello.so 去掉lib和so    }     public native String helloFormC();        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        System.out.println("------------"+helloFormC());    }}

2.2 javah命令生成签名

进入到项目的bin/classes命令下,执行命令 javah com.example.jni.MainActivity,将生成的头文件拷贝到jni目录下,在c文件中引入头文件 #include "com_example_jni_MainActivity.h" 。下面是javah命令的参数 和 生产头文件方式。

 在使用javah命令时如果遇到找不到Activity类,说明android的jar包没有导入进去,一种办法将jar包加入到classpath路径中去,classpath   .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\tools.jar;E:\developLib\android\platforms\android-8\android.jar;另一种方法是在window命令窗口执行:D:\project3\JNIAndroid>set classpath=D:\project3\JNIAndroid\src。

   2.3 创建C文件

jobject  就是当前方法所在的类代表的对象.JNIEnv类型代表了java环境 通过JNIEnv指针,就可以对java端的代码进行操作.

#include <stdio.h>#include <jni.h>#include <malloc.h>#include "com_example_jni_MainActivity.h";JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_helloFormC  (JNIEnv * env, jobject obj){    return (*env)->NewStringUTF(env,"hello from c ... ");}

  2.4 编译

通过cygwin编译c文件,进入到项目目录,我的项目名称是jni,进入之后执行“ndk-build”命令,出现如下图所示表示执行成功。

  2.5 创建Android.mk文件

需要将hello-jni替换成自己的c文件模块名称,在ndk中的位置 file:///D:/cgwin/android-ndk-r7b/docs/ANDROID-MK.html:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    :=HelloLOCAL_SRC_FILES :=Hello.cLOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)

LOCAL_LDLIBS += -llog表示在jni中打印日志信息,次信息在android控制台上可以看到。需要在c文件中加入如下代码:

#include <android/log.h>#define LOG_TAG "System.out.c"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

2.6 在android项目中的java文件引入编译生成的二进制文件。

static{        //加载二进制文件        System.loadLibrary("Hello");//libHello.so 去掉lib和so}

  2.7 最后部署项目,运行。


1 0
原创粉丝点击