参考了很多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!不见了