1. Eclipse ADT创建android工程
2.编译java本地调用方法
package com.skymr.learn;
public class HelloJni {
public static native void sayHello();
public native void sayHi();
public static native String getName(String name);
}
3.JNI部分
在android 工程 中创建目录jni, cmd进入到工程的src目录, 通过javah工具创建本地调用类对应的*.h,输出目录为jni
javah -d ../jni/jnispace com.skymr.learn.HelloJni打开生成的*.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_skymr_learn_HelloJni */
#ifndef _Included_com_skymr_learn_HelloJni
#define _Included_com_skymr_learn_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_skymr_learn_HelloJni
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_skymr_learn_HelloJni_sayHello
(JNIEnv *, jclass);
/*
* Class: com_skymr_learn_HelloJni
* Method: sayHi
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_skymr_learn_HelloJni_sayHi
(JNIEnv *, jobject);
/*
* Class: com_skymr_learn_HelloJni
* Method: getName
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_skymr_learn_HelloJni_getName
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
#include <jni.h>
#include "com_skymr_learn_helloJni.h"
void Java_com_skymr_learn_HelloJni_sayHello
(JNIEnv * env, jclass clazz){
}
void Java_com_skymr_learn_HelloJni_sayHi
(JNIEnv * env, jobject jo){
}
jstring Java_com_skymr_learn_HelloJni_getName
(JNIEnv * env, jclass, jstring){
return env->NewStringUTF("Hello World!");
}
在jni目录新建Android.mk文件,指定模块名和包含目录等配置
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := jnispace/helloJni.cpp
LOCAL_C_INCLUDES := jnispace
#LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_MODULE:= helloJni
include $(BUILD_SHARED_LIBRARY) cmd进入到jni目录,生成*.so库文件
注:先前用的ndk版本为r9b,报出了 cannot find -latomic 错误,现在换成了r14b
so文件生成成功,放到了工程的libs/armeabi/目录下
4.java中调用
调用前需要加载库
package com.skymr.learn;
public class HelloJni {
public static native void sayHello();
public native void sayHi();
public static native String getName(String name);
static{
System.loadLibrary("helloJni");
}
}
在Activity中调用public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("aaaa", "jni output: " + HelloJni.getName("a"));
}
}5,测试

本文详细介绍如何在Eclipse ADT中创建Android工程,并通过JNI实现Java与本地C/C++代码的交互。包括创建本地方法、使用javah工具生成头文件、实现本地方法及在Java中调用这些方法的过程。

4872

被折叠的 条评论
为什么被折叠?



