Win7下使用eclipse开发Android调用JNI-第一个程序

参考了很多csdn博主的文章,看到好多人写的在native程序中直接用printf函数输出信息,不懂介个是怎么做到的,反正我这边用printf输出信息,在模拟器上无显示耶


1.配置jdk,ndk,下载ADT,CDT等环境

2.打开eclipse,新建Android Application Project。File-New-Project-Android Application Project

   在弹窗中设定Application Name(Project Name与其同名,本例TestJNI),Package Name(自定义,本例com.panjinya.testjni),指定sdk版本

   一路Next

  设定Activity类名(本例HelloPJY.java),点击finish

3.检查NDK Location是否设定正确

4.新建Android 模拟器(自行百度)

5.(新建JNI目录及相关文件)右键工程名,选Android Tools-Add native support,指定JNI编译成的库名称(本例Testpjyjni),会新建同名cpp文件以及Android.mk文件

6.在java工程中src目录下,编辑HelloPJY.java文件。pjyJNI为即将在本地C++代码中实现的函数

package com.panjinya.testjni;

import android.app.Activity;
import android.os.Bundle;

public class HelloPJY extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
        pjyJNI();
    }

    static{
    	System.loadLibrary("Testpjyjni");
    }
    
    private native void pjyJNI();
}

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">7.使用javah命令生成对应的头文件</span>

   首先检查bin/classes目录下对应的package子文件夹中是否有上述java文件的类,然后cd到工程所在路径的src目录下,输入

   javah com.panjinya.testjni.HelloPJY                   即  javah 包名+类名

  会生成对应的com_panjinya_testjni_HelloPJY.h文件在当前目录下,这个文件无需编辑,直接拷贝到工程路径的/jni目录下

  

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_panjinya_testjni_HelloPJY */

#ifndef _Included_com_panjinya_testjni_HelloPJY
#define _Included_com_panjinya_testjni_HelloPJY
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_panjinya_testjni_HelloPJY
 * Method:    pjyJNI
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_panjinya_testjni_HelloPJY_pjyJNI
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

8.编辑jni目录下的Testpjyjni.cpp文件

   由于需要打印调试信息,验证是否成功执行该程序,在Android Application中不能直接使用printf之类的函数输出信息,需要用NDK中提供的log方法打印信息

  http://blog.csdn.net/qiuxiaolong007/article/details/7548580

  具体使用方法参见上述文档

#include <jni.h>
#include <android/log.h>
#define LOG_TAG "HelloPJY"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

#include "com_panjinya_testjni_HelloPJY.h"

JNIEXPORT void JNICALL Java_com_panjinya_testjni_HelloPJY_pjyJNI
  (JNIEnv *env, jobject obj)
{
	LOGD("MY MESSAGE");
	return;
}
9.编辑Android.mk文件,使得其可以输出log信息。(在第8,9两步,我反复看到各种错误,有时候LogCat里面根本没有任何信息,无论怎么修改cpp写法或者mk文件都无济于事,但是,最后删了模拟器重建,重启eclipse后,似乎好了。另外我还修改了Android.mk文件,没有使用$(SYSROOT)/usr/lib -llog这种格式,就没问题了)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Testpjyjni
LOCAL_SRC_FILES := Testpjyjni.cpp
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)
10.点击项目,Build project,编译.so文件成功后,点击Run as-Android Application,用指定的模拟器就可以了,在LogCat中可以过滤到自己的信息


BTW:第一次用这个东东,真是菜鸟到极致,默认生成的java类里面,一开始是有三个方法的,都可以override,貌似如果默认使用的话,编译成功会直接在app上面打印一句Hello World!

还好我打印信息并没有用Hello World!这一句,否则就傻乎乎以为自己printf的信息,在app上打印出来了

Menu和MenuItem这两个类,我后来直接去掉 了,貌似木有啥影响,当然自动打印的Hello World!不见了

你可能感兴趣的:(Win7下使用eclipse开发Android调用JNI-第一个程序)