**

一、配置步骤:

**
第一步是在/src/main/中建立一个文件夹cpp
第二步是在文件夹中建立两个文件一个是native-lib.cpp和CMakeLists.txt
第三步在上述两文件中添加如下内容:

//native-lib.cpp
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring
JNICALL
Java_com_example_ls_test1_Main1Activity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
#CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
             native-lib
             # Sets the library as a shared library.
             SHARED
             # Provides a relative path to your source file(s).
             native-lib.cpp )
find_library( # Sets the name of the path variable.
              log-lib
              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )
target_link_libraries( # Specifies the target library.
                       native-lib
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

第四步往src目录下的build.gradle文件中补充与CMakeLists.txt和native-lib.cpp的相关信息进行关联,具体如下步骤:
在这里插入图片描述
(1)在defaultConfig子项中添加,支持C++的编译选项:

  externalNativeBuild {
      cmake {
          cppFlags "-std=c++11"
      }
  }

(2)在android子项中添加关联CMakeLists.txt信息,其中Cmake版本号可以不填写

    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.10.2'
        }
    }

(3)点击文件右上角中的Sync Now进行同步即可
在这里插入图片描述
**

二、编译遇到的问题

**
1、一般情况下如果我们的工程配置是我们自己的IDE生成的话一般是不会报错的
2、如果是拿了原来旧的工程或者别人生成的工程然后再添加支持JNI的话,此时有可能会报如下的错:
(1)类似如下的错误,可能是由于工程中另一个总的build.gradle中gradle的版本号有差异导致的。
此时需要修改为与你的IDE环境相匹配的版本应该就没有问题了,我这里由于重新新建一个NativeC++工程IDE默认的版本为4.0.1,因此我将原来的旧工程的3.2.1修改为4.0.1后再同步一下这个问题就没有了。

A problem occurred configuring project ':app'.
> java.lang.NullPointerException (no error message)
* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':app'.
	at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:80)
	at 
	... 115 more

在这里插入图片描述
(2) 如果遇到如下问题,不用担心会有解决方法的,通常情况下会有如下几个地方需要检查一下:

1、在IDE中是否这几个JNI函数能够按住Ctl+鼠标左键自由跳转,即在源文件中是否已经定义了
(1)如果是的话跳到2中继续排查
(2)如果不能跳转则需要确保这个jni函数已经被实现了

2021-09-11 03:46:00.461 4824-4824/com.lancoo.floating E/art: No implementation found for java.lang.String com.lancoo.floating.FxService.stringFromJNI() (tried Java_com_lancoo_floating_FxService_stringFromJNI and Java_com_lancoo_floating_FxService_stringFromJNI__)
2021-09-11 03:46:00.462 4824-4824/com.lancoo.floating D/AndroidRuntime: Shutting down VM
    --------- beginning of crash
2021-09-11 03:46:00.463 4824-4824/com.lancoo.floating E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.lancoo.floating, PID: 4824
    java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.lancoo.floating.FxService.stringFromJNI() (tried Java_com_lancoo_floating_FxService_stringFromJNI and Java_com_lancoo_floating_FxService_stringFromJNI__)
        at com.lancoo.floating.FxService.stringFromJNI(Native Method)
        at com.lancoo.floating.FxService$MyBroadcastReceiver.onReceive(FxService.java:371)
        at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1122)

2、检查在调用JNI函数的Java类中是否添加了如下一句,来显示进行引用libnative-lib.so:

public class A {
	........
    static{
        System.loadLibrary("native-lib");
    }
    .......
}

3、如果在1和2已经添加了还出现上述的问题,此时则需要检查一下打包的时候架构是否正确了,这个可以查看一下build-gradle中是否已经配置好了安卓的架构,如果没有则需要配置好。
在这里插入图片描述
(3)如果还出现其他问题的话可能需要关注一下如下几个点应该会对配置有帮助:
1、ndk版本是否正确
2、配置的ndk路径是否正确,这里包括系统的环境变量中的路径
3、CMake的版本是否正确

三、总结

本文主要针对的是有原来原生Java 的安卓工程添加支持JNI出现的问题和解决思路进行了记录,对于如果直接新建JNI工程不在本文的范围内,希望对日常开发遇到该类的问题的开发者,能够提供一个有效的解决思路。

参考链接:https://blog.csdn.net/u010456460/article/details/108443514

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐