安卓NDK流程

  • 定义wrap类,声明native函数,加载库
package com.ndk.hello;

public class Classs {

    public native String say_hello();
    static
    {
        System.loadLibrary("HelloAndroidNDK");
    }
}
  • 在项目根目录创建jni文件夹,在此文件夹生成JNI头文件
javah -classpath ../bin/classes com.ndk.hello.Classs
  • 为生成的com_ndk_hello_Classs.h写实现文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ndk_hello_Classs */

#ifndef _Included_com_ndk_hello_Classs
#define _Included_com_ndk_hello_Classs
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ndk_hello_Classs
 * Method:    say_hello
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ndk_hello_Classs_say_1hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
#include "com_ndk_hello_Classs.h"

JNIEXPORT jstring JNICALL Java_com_ndk_hello_Classs_say_1hello(JNIEnv * env, jobject this)
{
    return (*env)->NewStringUTF(env,"Hello Java NDK!");
}
  • 在jni文件夹写Android.mk文件
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloAndroidNDK
LOCAL_SRC_FILES := com_ndk_hello_Classs.c

include $(BUILD_SHARED_LIBRARY)
  • 在jni文件夹中交叉编译mk文件
$NDK/ndk-build
  • 将生成libs/armeabi/libHelloAndroidNDK.so文件
  • 编写安卓框架程序,调用native方法。
package com.ndk.hello;
import com.ndk.hello.Classs;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroidNDK extends Activity{
    @Override
    public void onCreate(Bundle s)
    {
        super.onCreate(s);
        
        Classs c = new Classs();
        
        String say = c.say_hello();
        TextView tv = new TextView(this);  
        tv.setText(say);  
        setContentView(tv);  
    }
}

 

posted @ 2015-02-03 20:12  wubugui  阅读(208)  评论(0编辑  收藏  举报