eclipse的JNI学习
来源:互联网 发布:霍金人工智能开场白 编辑:程序博客网 时间:2024/05/31 19:23
普通.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初步学习到此为止!
- eclipse的JNI学习
- eclipse的jni配置
- Eclipse的JNI环境搭建
- JNI的学习
- jni的学习使用
- jni的c学习
- Android NDK (学习笔记七) —— JNI的交互处理之Eclipse开发工具配置
- eclipse下JNI的初步实现
- eclipse下编译jni的配置
- Eclipse + CDT 实现JNI 的方法
- eclipse ndk编译JNI的设置
- Eclipse编译JNI的三种方法
- Eclipse下的Android JNI 开发
- eclipse快速开发JNI的方法
- Eclipse下的Android JNI 开发
- android+eclipse+jni遇到的一些问题
- Eclipse下的Android JNI 开发
- Eclipse下的Android JNI 开发
- android AlertDialog中的Edittext自动获取焦点并弹出软键盘
- 程序员智力题
- Python魔法(1)
- [数据结构与算法]队列的优先级
- CryptCreateHash + CALG_MD5
- eclipse的JNI学习
- Delphi 编写IC控件
- Open the file under the specified path, unlimited file name
- uCOS时钟节拍和滴答定时器的关系
- 数据库系统操作备忘(三)
- javascript 循环 while ,for ,switch ,do..while,for ..in
- JDK7的Comparison method violates its general contract异常
- 查看sql语句执行时间/测试sql语句性能
- HDU 4638 Group 莫队算法