android jni调用

1. 写java代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    testHello("testHello");
}
static{
    System.loadLibrary("testjni");
}
private native void testHello(String str);

2. 利用javah生成头文件

javah -classpath A -d B C

javah -classpath bin/classes -d jni/src com.example.test.MainActivity

-classpath A A表示类路径

-d B B表示头文件生成目录

C表示包名.类名

注:在这一步里在win7下怎么都生成不了,一直报有错

错误: 无法访问android.app.Activity
 找不到android.app.Activity的类文件

javah路径是指向jdk路径的,不可能有什么问题,命令行就这些,直接在linux下执行了一次,没问题,真不知问题出在哪?

补充:

对于这个错,可以通过增加android.jar来解决

javah -classpath "D:\Download\adt-bundle-windows-x86_64-20131030\sdk\platforms\android-17\android.jar;bin/classes" -d jni/src com.example.audiotest.MainActivity



3. 建立jni文件夹,根据头文件写c代码,写Android.mk

目录树结构如下

android jni调用_第1张图片


audiotest.c

#include <stdio.h>
#include <android/log.h>
#include "com_example_audiojnitest_MainActivity.h"

JNIEXPORT void JNICALL Java_com_example_audiojnitest_MainActivity_testHello
  (JNIEnv *env, jobject obj, jstring str)
{
	char *p = (char *)(*env)->GetStringUTFChars(env, str, JNI_FALSE);
	__android_log_print(ANDROID_LOG_ERROR, "audiotest", p) ;
	return ;
}

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testjni
LOCAL_SRC_FILES := src/audiotest.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

4. 执行结果可以在eclipse里看到


你可能感兴趣的:(android jni调用)