Android使用Jni调用C++/C方法详解
什么是JNI?
JNI全称Java Native Interface,就是Java本地接口,它可以让Java程序调用其他语言编写的动态库,比如C++、C语言等。
Jni调用C++/C方法步骤
- 准备好动态库。在使用Jni调用C++/C方法之前,首先需要编写好被调用的C++/C代码,并将其编译成动态库。在编译完成后,需要将其添加到Android工程中。
- 编写Java类。在Java类中声明一个native方法,并在static代码块中使用System.loadLibrary加载编译好的动态库。
- 使用javah生成对应的头文件。在工程的src/main/java目录中执行命令:javah <包名>.<类名>。例如:
javah com.example.myapp.MainActivity
- 在刚刚生成的头文件中,实现刚刚在Java类中声明的native方法。这里就可以使用C++/C代码实现功能。
- 将C++/C代码编译成动态库,将其添加到Android工程中。
- 在Java类中调用native方法即可完成Jni调用C++/C方法操作。
示例说明
以下是两个例子来具体说明Jni调用C++/C方法的过程。
示例一:返回一个int
C++代码实现
#include<iostream>
#include<cstring>
extern "C" {
int add(int a, int b); //声明,表明该方法供其他代码调用
}
int add(int a, int b) {
return a + b;
}
配置CMake
//生成一个共享库 libadd-lib
add_library(
add-lib
SHARED
add.cpp)
target_link_libraries(
add-lib
android
log)
Java代码实现
MainActivity.java:
package com.example.jni;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
//本地方法,实现具体的加法运算
public native int add(int a, int b);
//初始化动态库
static {
System.loadLibrary("add-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int result = add(1, 2);
((TextView)findViewById(R.id.sample_text)).setText("1+2=" + result);
}
}
示例二:返回一个字符串
C++代码实现
#include<iostream>
#include<cstring>
extern "C" {
char * greet(const char * name); //声明,表明该方法供其他代码调用
}
char * greet(const char * name)
{
char * greeting = new char[30];
if (greeting == nullptr) {
return nullptr;
}
strcpy(greeting, "Hello ");
strcat(greeting, name);
return greeting;
}
配置CMake
//生成一个共享库 libgreet-lib
add_library(
greet-lib
SHARED
greet.cpp)
target_link_libraries(
greet-lib
android
log)
Java代码实现
MainActivity.java:
package com.example.jni;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
//本地方法,实现具体的加法运算
public native String greet(String name);
//初始化动态库
static {
System.loadLibrary("greet-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String result = greet("Linus");
((TextView)findViewById(R.id.sample_text)).setText(result);
}
}
以上就是Jni调用C++/C方法的步骤和示例说明。如果有其他问题,欢迎在评论区留言。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android使用jni调用c++/c方法详解 - Python技术站