Android Java与C++的调用
来源:互联网 发布:xp linux双系统引导 编辑:程序博客网 时间:2024/06/06 02:18
2016年3月17日
1 新建一个Android工程,比如 JniTest
2. 工程右键, Android Tools -> Add Native Support...
3. 在 jni 文件中的 JniTest.cpp 中,写如下代码:
#include <jni.h>extern "C"{JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_strFromJNI(JNIEnv *env,jobject pObj) {return env->NewStringUTF("Hello JNI");}JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_add(JNIEnv *env, jobject pObj, jint a, jint b){jint res = -1;res = a + b;return res;}}
4.Android项目中的 java代码 MainActivity.java 中添加如下绿色代码
public class MainActivity extends Activity {
static{
System.loadLibrary("JniTest");
}
public native String strFromJNI();
public native int add(int a, int b);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(strFromJNI());
TextView txtView2 = (TextView)findViewById(R.id.txtViewtoo);
int n = add(0,0);
txtView2.setText(String.valueOf(add(5, 104)));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
-------------------------------------------------------
MainActivity中使用的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/itemlayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id = "@+id/txtView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <TextView android:id = "@+id/txtViewtoo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </LinearLayout>
运行结果:
其它:
JNI接口的命名规范是:
Java_ + 调用该方法的包名(包名的点用_代替) + _ + 调用该接口的类名 + _ + 方法名
Java_com_example_jnitest_MainActivity_add
包名:com_example_jnitest
调用类:MainActivity
方法名:add
对于实例方法,有两个参数是必要的,一个JNI的环境指针JNIEnv *,另一个是调用该方法的Java实例jobject
JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_add(
JNIEnv *env, jobject pObj, jint a, jint b){
jint res = -1;
res = a + b;
return res;
}
使用ndk库必须在static代码块里面用System.loadLaibrary加载.so库
编译器会按C语言的方式编译和连接。在C语言中,函数编译之后函数名与C++函数编译之后不同,例如foo(int x, int y),C可能会编译成_foo的名字,而C++因为支持重载,所以会编译成像_foo_int_int这种带参数的函数名。如果是按照C语言的编译方式,调用foo函数是找不到_foo的函数名就会报出函数名找不到的错误。所以要添加extern "C"修饰。
- Android Ndk中C与JAVA之间的互相调用
- Android 平台下Java与C/C++的相互调用
- JNI JAVA与C的互相调用
- Android C调用Java
- android java 调用 c
- android C调用JAVA的方法
- Android NDK (学习笔记八) —— Java代码与C代码间方法的调用
- Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调
- Android NDK开发 Java与C互相调用实例详解
- Android NDK开发----- Java与C互相调用实例详解
- Android NDK开发----- Java与C互相调用实例详解
- Android ---js与java的相互调用
- Android ---js与java的相互调用
- Android ---js与java的相互调用
- android-java与C++的相互调用
- Android Java与C++的调用
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- @RequestBody, @ResponseBody 注解详解(转)
- Java:单例模式的7种写法
- LDS文件格式简单用法备注
- 移动端H5页面高清多屏适配方案
- 成为JavaGC专家(2)
- Android Java与C++的调用
- oracle中如何更改order by的默认排序?
- VBA学习笔记(1)
- hdfs sync的同步代码重构
- Android开发_控制硬加速hardwareAccelerated
- Oracle表空间、段、区和块简述
- 【小镇的技术天梯】Fast-CGI和php-fpm之间的关系
- 磁盘及文件系统管理(分区,挂载,卸载,信息展示与统计)
- 哈希冲突之开链法