您的位置:首页 > 编程语言 > Java开发

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

2015-12-14 20:19 465 查看
参考了很多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!不见了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: