新浪微博 登陆  注册   设为首页 加入收藏

学PHP >> Android开发应用 >> Android JNI的使用

Android JNI的使用

查看次数2819 发表时间2013-06-04 23:36:33

下面是一个简单的JNI编程实例1 新建Android ApplicationProject。项目名称设为JniTest,其它采用默认配置。2 新建Test类。写出对固有方法以及它的自变量进行声明的Java代码package com.example.jnitest;...

下面是一个简单的JNI编程实例

1 新建Android ApplicationProject。项目名称设为JniTest,其它采用默认配置。

2 新建Test类。写出对固有方法以及它的自变量进行声明的Java代码

package com.example.jnitest;

public class Test {
	public static native void ShowMessage(String msg);
	static {
		System.loadLibrary("jnitest");
	}

}

这里只声明了一个方法ShowMessage。

static 代码块中的内容是加载动态库libjnitest.so


3 生成C头文件

编译头Test.java文件,并对编译出来的.class文件运行javah。

步骤如下:

假设工程目录为:F:workspaceJniTest

执行如下命令

cd /d F:workspaceJniTestinclasses

javah com.example.jnitest.Test

然后会在目录F:workspaceJniTestinclasses

生成一个com_example_jnitest_Test.h文件。javah 会读入类文件,并为每个固有方法声明在C 或C++头文件里生成一个函数原型。

4 完成C或C++代码

新建msg.c文件,其内容如下

#include "com_example_jnitest_Test.h"
#include <stdio.h>
#include <android/log.h>  //for __android_log_print

/*
	ShowMessage的实现
*/
JNIEXPORT void JNICALL Java_com_example_jnitest_Test_ShowMessage(JNIEnv *jEnv, jobject this, jstring jMsg)
{
  	const char * msg;
	msg = (*jEnv)->GetStringUTFChars(jEnv, jMsg,0);
	printf("From jni: %s
", msg);  //这个打印在eclipse 的logcat看不到,
       //下面的打印是为了在logcat中可以看到。
	__android_log_print(ANDROID_LOG_INFO, "JniTest","%s", msg); 
	(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);
}

5 编译生成动态库

在你配置好NDK环境的系统中新建一个jnitest文件夹,并在其下新建一个jni文件夹。把msg.c和javah生成的头文件拷贝到jnitest/jni目录下。

然后新建Android.mk文件,内容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -fvisibility=hidden
LOCAL_ARM_MODE := arm
LOCAL_LDLIBS :=-L$(SYSROOT)/usr/lib -llog
LOCAL_SRC_FILES := msg.c
LOCAL_MODULE := msgimpl
include $(BUILD_SHARED_LIBRARY)

cd 到jnitest/jni目录下,执行ndk-build进行编译


6 回到eclipse


如图在libs文件夹下创建一个文件夹并命名为armeabi,然后把生成的libjnitest.so拖到该文件夹下面。


7 java代码中调用ShowMessage()

我们在MainActivity.java中的onCreate函数中调用ShowMessage()5次。

Test.ShowMessage("Msg 1 from java");

Test.ShowMessage("Msg 2 from java");

Test.ShowMessage("Msg 3 from java");

Test.ShowMessage("Msg 4 from java");

Test.ShowMessage("Msg 5 from java");

打印5条不同的消息。


8 运行JniTest

一切正常的话,你会在logcat看到5条这样的消息


证明已经成功调用到C中的实现





(转发请注明转自:学PHP)    


  相关推荐




  发表评论
昵称:
(不超过20个字符或10个汉字)
内容: