普通.os文件使用方法:
1、在你的项目根目录下建立libs/armeabi目录;
2、将libxxx.so文件copy到 libs/armeabi/下;
3、此时ADT插件自动编译输出的.apk文件中已经包括.so文件了;
4、安装APK文件,即可直接使用JNI中的方法;
我想还需要简单说明一下libxxx.so的命名规则,沿袭Linux传统,lib<something>.so是类库文件名称的格式,但在Java的System.loadLibrary(“ something ”)方法中指定库名称时,不能包括 前缀—— lib,以及后缀——.so。
完成自己的jni编程并生成.os文件
public class TestJni {
public native boolean init();
public native int add(int x , int y);
public native void destory();
public native String getString();
}
#include <jni.h>
/* Header for class com_example_jni_TestJni */
#ifndef _Included_com_example_jni_TestJni
#define _Included_com_example_jni_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jni_TestJni
* Method: init
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_com_example_jni_TestJni_init
(JNIEnv *, jobject);
/*
* Class: com_example_jni_TestJni
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_jni_TestJni_add
(JNIEnv *, jobject, jint, jint);
/*
* Class: com_example_jni_TestJni
* Method: destory
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jni_TestJni_destory
(JNIEnv *, jobject);
/*
* Class: com_example_jni_TestJni
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jni_TestJni_getString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
com_example_jni_TestJni.cpp,源码:
#include <stdlib.h>
#include "com_example_jni_TestJni.h"
#include "Add.h"
CAdd *pCAdd = NULL;
JNIEXPORT jboolean JNICALL Java_com_example_jni_TestJni_init(JNIEnv *env,jobject obj) {
if (pCAdd == NULL) {
pCAdd = new CAdd;
}
return pCAdd != NULL;
}
JNIEXPORT jint JNICALL Java_com_example_jni_TestJni_add(JNIEnv *env, jobject obj,
jint x, jint y) {
int res = -1;
if (pCAdd != NULL) {
res = pCAdd->Add(x, y);
}
return res;
}
JNIEXPORT void JNICALL Java_com_example_jni_TestJni_destory(JNIEnv *env, jobject obj)
{ if (pCAdd != NULL)
{
pCAdd = NULL;
}
}
JNIEXPORT jstring JNICALL Java_com_example_jni_TestJni_getString(JNIEnv *env, jobject obj){
return env->NewStringUTF("HELLO JNI!!");
}
Add.cpp文件源码:
CAdd::CAdd() {
}
CAdd::~CAdd() {
}
int CAdd::Add(int x, int y) {
return x + y;
}
Add.h文件源码:
#define _TEST_JNI_ADD_H_
class CAdd {public:
CAdd();
~CAdd();
int Add(int x, int y);
};
#endif
修改Android.mk文件内容为:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := com_example_jni_TestJni.cpp
LOCAL_SRC_FILES += Add.cpp
include $(BUILD_SHARED_LIBRARY)
此时应该会报错,解决办法:右击工程名,选择Properties,打开Properties for JniTest,选择C/C++ General-->Paths and Symbols-->includes-->add-->File system,选择android-ndk-r10b的文件解压路径,然后依次选择android-ndk-r10b-->platforms-->android-?(选择对应的android target版本)-->arch-arm-->usr-->include,点击确定添加。此时clean并rebuild project,错误消失。此时会在libs文件夹下生成一个armeabi文件夹,打开armeabi,里面就有我们需要的libTestJni.os文件。
5、在我们新建的TestJni.java文件中添加以下代码:
static{
System.loadLibrary("JniTest");
}
在MainActivity.java中修改以下代码:
public class MainActivity extends Activity {
TextView tvX = null;
TextView tvY = null;
TextView tvSum = null;
Button btnAdd = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvX = (TextView)findViewById(R.id.et_x);
tvY = (TextView)findViewById(R.id.et_y);
tvSum = (TextView)findViewById(R.id.et_sum);
btnAdd = (Button)findViewById(R.id.btn_add);
btnAdd.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
int x = Integer.valueOf( tvX.getText().toString());
int y = Integer.valueOf( tvY.getText().toString());
int sum = 0;
TestJni jni = new TestJni();
boolean flag = jni.init();
if(flag){
sum = jni.add(x, y);
}
btnAdd.setText(String.valueOf(sum));
jni.destory();
tvSum.setText(String.valueOf(jni.getString()));
}
});
}
}
此时就是通过调用TestJni中的方法使用C和C++进行计算。试一下结果:
点击button后:
我们的jni初步学习到此为止!