如何将JNI(C/C+;+;本机代码)添加到现有的Android Studio项目中

如何将JNI(C/C+;+;本机代码)添加到现有的Android Studio项目中,android,java-native-interface,Android,Java Native Interface,如标题所述-如何向现有Android Studio项目添加本机代码,而不破坏当前项目,包括gradle和proguard设置?从现有项目中执行以下步骤: 1.修改build.gradle(模块应用程序)使其看起来像这样(有很多变化!): 您可以复制/粘贴上述代码,并至少使用“-value--”修改值以匹配您的代码 2.修改build.gradle(项目) 上面写着这样的话: dependencies { classpath 'com.android.tools.build:gradle:

如标题所述-如何向现有Android Studio项目添加本机代码,而不破坏当前项目,包括gradle和proguard设置?

从现有项目中执行以下步骤:

1.修改build.gradle(模块应用程序)使其看起来像这样(有很多变化!): 您可以复制/粘贴上述代码,并至少使用“-value--”修改值以匹配您的代码

2.修改build.gradle(项目) 上面写着这样的话:

dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
}
为此:

dependencies {
    classpath 'com.android.tools.build:gradle-experimental:0.9.3'
}
我的示例中的数字0.9.3是gradle实验的最新版本。如果您尚未将gradle-wrapper.properties中的gradle版本更改为Android Studio推荐的版本,请最终将其更改为该版本

3.移动proguard设置文件
proguard android optimize.txt
app/proguard android optimize.txt

4.添加来自java的调用 像这样

static {
    System.loadLibrary("--c-file--");
}
private native byte my_jni(Context context, byte[] mByte, int i);
改变你的需要。上面的示例加载c文件(写入时不带扩展名)——与gradle文件中声明的相同,并调用函数my_jni,传递应用程序的上下文、一些字节数组和一些int,期望函数返回一个字节

5.在JNI中创建函数: 现在,您的函数名称以红色突出显示-通过单击行上的红灯,允许Android Studio创建它
create function…
。这将在c文件中创建函数并将焦点更改为它

多恩 进一步阅读

小贴士:

  • 注意
    free
    你的一切
    malloc
    ReleaseByteArrayElements
    对于每个
    GetByteArrayElements
    等等

  • 注意如何正确地将一些危险的值从C返回到Java,如数组和字符串


自Android Studio 3.1以来,其可能的简单方式是:

1。在
app\src\main
中创建
cpp
文件夹

2。在
app\src\main\cpp
路径中创建
.cpp
文件(如native lib.cpp)

3。将
CMakeLists.txt
文件添加到
app
文件夹。

<>在该文件的文件名中,<>代码> CPP 4。添加到build.gradle(模块应用程序)
externalNativeBuild
标记,并参考
CMakeLists.txt
添加到
android
部分:

android {
    compileSdkVersion 26
    defaultConfig {
        ...
    }
    buildTypes {
        ...
    }
    externalNativeBuild {               <--- these lines should be added
        cmake {                         <--- these lines should be added
            path "CMakeLists.txt"       <--- these lines should be added
        }                               <--- these lines should be added
    }                                   <--- these lines should be added
}
...
defaultConfig {
    applicationId "<YOUR_APP_ID>"
    minSdkVersion 26
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"


    externalNativeBuild {   <--- these lines should be added
        cmake {             <--- these lines should be added
            cppFlags ""     <--- these lines should be added
        }                   <--- these lines should be added
    }                       <--- these lines should be added
}
...

(Basic)<代码> Bug .GooLe4/Cuff>文件,也可在新的、带有C++支持的Android工作室中使用)

6。与Gradle文件重新同步项目

通过单击工具栏中的“同步项目”。注意!在Android Studio 3.3中,图标为

另外,看一看

PS.如果文件未显示在
cpp
文件夹中:

android {
    compileSdkVersion 26
    defaultConfig {
        ...
    }
    buildTypes {
        ...
    }
    externalNativeBuild {               <--- these lines should be added
        cmake {                         <--- these lines should be added
            path "CMakeLists.txt"       <--- these lines should be added
        }                               <--- these lines should be added
    }                                   <--- these lines should be added
}
...
defaultConfig {
    applicationId "<YOUR_APP_ID>"
    minSdkVersion 26
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"


    externalNativeBuild {   <--- these lines should be added
        cmake {             <--- these lines should be added
            cppFlags ""     <--- these lines should be added
        }                   <--- these lines should be added
    }                       <--- these lines should be added
}
...

尝试
File/Invalidate Caches&Restart
,如他的评论所述。

自从上次更新Android Studio(3.3.1)以来,我的cpp文件夹是空的。是否有任何关于如何集成本机源文件的更新,或者它是AS中的一个bug?@clash只需按照回答中的描述手动创建必要的文件。不幸的是,它不起作用。我总是在AS的cpp文件夹中看到我的文件,但现在它们不见了。我只是按照描述读了所有内容,使缓存无效并重新导入gradle项目,但没有成功。我想这可能是一个错误,也可能是工作流中的一个更改。@clash 1)您可以通过文件管理器添加它们;2) 您应该正确配置
CMakeList.txt
。@clash哦,我只是在app.iml文件中添加了一个文件,然后又尝试了一次file/Save->file/Invalidate Caches&Restart(我猜超过10次-有时有效,有时无效),现在文件显示在cpp文件夹中。不要这样做,因为实验gradle已弃用,不再维护,请尽快前往cmake