参考资料:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0415/1166.html
第一步:创建一个AndroidJniTest的Android工程,默认会生成MainActivity.java文件,在该目录下新建新类TestJNI.java。如下图:
第二步:编写TestJNI.java,代码如下:
package com.example.demo;
public class TestJNI {
static{
System.loadLibrary("jniinterface");
}
public static native int getInt();
public static native String getString();
}
第三步:使用cmd命令使生成C++的.h头文件:
第四步:拷贝生成的.h头文件。
使用第三部的命令后,后发现在目录F:\program2\AndroidJniTest\bin\classes下生成了com_example_demo_TestJNI.h文件。在工程中新建文件夹jni,将上面的.h头文件拷贝到jni文件夹下。
第五步:编写C++代码和android.mk文件
1 编写C++代码。将.h头文件里生成的函数复制到.cpp文件下,实现其函数:
#include"com_example_demo_TestJNI.h"//包含刚生成的头文件
#include<stdio.h>
#include<stdlib.h>
int sum()
{
int x,y;
x = 100;
y = 1000;
x += y;
return x;
}
JNIEXPORT jint JNICALL Java_com_example_demo_TestJNI_getInt
(JNIEnv *, jclass)//复制头文件生成的函数,实现该函数
{
return sum();
}
JNIEXPORT jstring JNICALL Java_com_example_demo_TestJNI_getString
(JNIEnv *env, jclass)//此处的env参数头文件没有
{
return env->NewStringUTF("HelloNDK");
}
2 编写android.mk文件。android.mk可以直接从NDK的samples里例子的jni目录下直接拷过来改一下。代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jniinterface
LOCAL_SRC_FILES := com_example_demo_TestJNI.cpp
include $(BUILD_SHARED_LIBRARY)
其中你只需要该LOCAL_MODULE和LOCAL_SRC_FILES就可以了。
说明:LOCAL_MODULE是描述模块的,用来给java调用的模块名,会生成对应的libtestJni.so
LOCAL_SRC_FILES就是源文件啦,多个文件空格隔开即可。
接下来,我们要开始编译生成so文件咯。
第六步:编译生成.so文件。
编译生成 .so文件后工程如下:
第七步:用Android调用JNI
package com.example.demo;
import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView)findViewById(R.id.name);
tv.setText(String.valueOf(TestJNI.getInt()+", "+TestJNI.getString()));
}
}
运行程序如下:
程序代码:http://download.youkuaiyun.com/detail/yegucheng2618/7613475