JNI有两种主要的实现方式:
- 静态方式
- 动态注册
- 静态方法实现步骤:
1.Java代码中添加库和native方法声明:
package com.example.testndk;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
public class TestNDK extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView myTextView = new TextView(this);
myTextView.setText( stringTestNdk() );
setContentView(myTextView);
}
//native方法
public native String stringTestNdk();
//加载库,libtestNDK.so
static {
System.loadLibrary("testNDK");
}
}
2.运行工程,生成.class文件
3.生成javah文件:
- Java 1.6
$ javah -classpath bin/classes -d jni com.example.testndk.TestNDK
- Java 1.7
- eclipse:切换在工程的src目录下
- android studio :切换在工程的app/src/main/java/目录下
$ javah com.example.testndk.TestNDK
//每个class都会产生一个对应的.h文件(所以一个Activity可能产生多个.h文件),每个*.h文件命名格式固定:包名_类名.h
4 实现头文件中声明的函数
新建文件jni/testNDK.c。testNDK.c的代码如下:
#include <string.h>
#include<jni.h>
JNIEXPORT jstring JNICALL Java_com_example_testndk_TestNDK_stringTestNdk
(JNIEnv* env, jobject obj)
{
return (*env)->NewStringUTF(env, "Hello JNI!");
}
testNDK.c的作用就是实现com_example_testndk_TestNDK.h中声明的函数。
5 编写实现函数对应的Android.mk
添加文件jni/Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE := testNDK
LOCAL_SRC_FILES:= testNDK.c
include$(BUILD_SHARED_LIBRARY)
6 编译生成库文件
进入到工程所在目录,执行ndk-build,编译生成.so库文件。
$ cd jni$ ndk-build
生成库文件所在目录:libs/armeabi/libtestNDK.so
7 运行工程
在eclipse下运行工程,ok。
- 动态方法实现步骤:
未完待续。。。
网友评论