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

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


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


实现这些方法, 新建文件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.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,测试







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值