Android App中通过JNI调用C/C++代码

来源:互联网 发布:卫裤网站源码 编辑:程序博客网 时间:2024/06/06 00:04


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 __cplusplusextern "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


实现这些方法, 新建文件helloJni.cpp

#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.cppLOCAL_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,测试