一、适用:
因为架构迁移或者开发需要,有时候需要在android应用开发中,调用已有的c语言开发库,此时可能需要用到JNI。
二、示例:
1、Android Studio安装“合适的”ndk版本、cmake
NDK 修订历史记录 | Android NDK | Android Developers
2、在CMakeLists.txt中添加需要编译的文件、和需要导入的c语言库。
添加native-lib.cpp,编译成库local-lib
#https://blog.csdn.net/weixin_51380973
add_library( # Sets the name of the library.
local-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp
)
target_include_directories(
local-lib
PRIVATE
${CMAKE_SOURCE_DIR}/include
)
target_include_directories(
local-lib
PRIVATE
${CMAKE_SOURCE_DIR}/../jniLibs/include
)
导入remote-c.so库,命名为 remote-lib
add_library(remote-lib SHARED IMPORTED)
set_property(TARGET remote-lib PROPERTY IMPORTED_NO_SONAME 1)
set_target_properties(remote-lib PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/remote-c.so)
target_link_libraries( # Specifies the target library.
local-lib
remote-lib)
#https://blog.csdn.net/weixin_51380973
3、使用java语言格式,添加Activity、Class
public class JNITestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xxx);
JNITest();
}
public void JNITest(){
new Thread(new Runnable() {
@Override
public void run() {
//https://blog.csdn.net/weixin_51380973
callLocalJava();
}
}).start();
}
}
public class CallLocalTest {
public static void callLocalJava(){
callLocalCJNI();
}
//https://blog.csdn.net/weixin_51380973
private static native int callLocalCJNI();
}
4、使用C++言格式编写cpp文件、.h文件
//https://blog.csdn.net/weixin_51380973
//native-lib.cpp
//${CMAKE_SOURCE_DIR}/include
JNIEXPORT jint JNICALL Java_com_your_packetName_CallLocalTest_callLocalCJNI(JNIEnv
*env,jobject obj){
jint i;
i=callRemoteCLibFuction();
return i;
}
//https://blog.csdn.net/weixin_51380973
//main.h
//${CMAKE_SOURCE_DIR}/../jniLibs/include
//main.h内容参考remote-c.so中callRemoteCLibFuction所在头文件内容
int callRemoteCLibFuction();
5、大功告成