往android studio原生java工程中添加jni的过程

**

一、配置步骤:

**
第一步是在/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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio进行JNIJava Native Interface)开发,可以让我在Java代码调用C/C++代码,实现跨语言的功能。下面是在Android Studio进行JNI开发的一般步骤: 1. 创建一个新的Android项目或打开一个已有的项目。 2. 在项目的`app`模块下,创建一个名为`jni`的文件夹(如果没有的话)。 3. 在`jni`文件夹下,创建一个名为`native-lib.cpp`(或其他任意名称)的C/C++文件,用于编写JNI代码。 4. 在`native-lib.cpp`文件,编写你需要的C/C++代码。这些代码将会被Java代码调用。 5. 在`app`模块的`build.gradle`文件添加以下配置: ``` android { ... defaultConfig { ... externalNativeBuild { cmake { cppFlags "" } } } ... externalNativeBuild { cmake { path "CMakeLists.txt" } } } ``` 6. 在`app`模块下,创建一个名为`CMakeLists.txt`的文件,并添加以下内容: ``` cmake_minimum_required(VERSION 3.10.2) project("YourProjectName") add_library( native-lib SHARED native-lib.cpp ) find_library( log-lib log ) target_link_libraries( native-lib ${log-lib} ) ``` 7. 在Android Studio的底部工具栏,点击"Build Variants"按钮,将"Active Build Variant"设置为`native-lib`。 8. 在Android Studio的顶部菜单,点击"Build" -> "Make Project",编译项目。 9. 在Java代码,通过`System.loadLibrary("native-lib")`加载C/C++库,并调用其的函数。 这样,你就可以在Android Studio进行JNI开发了。记得在编写JNI代码时,遵循JNI的规范和语法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值