如何将JNI(C/C+;+;本机代码)添加到现有的Android Studio项目中
如标题所述-如何向现有Android Studio项目添加本机代码,而不破坏当前项目,包括gradle和proguard设置?从现有项目中执行以下步骤: 1.修改build.gradle(模块应用程序)使其看起来像这样(有很多变化!): 您可以复制/粘贴上述代码,并至少使用“-value--”修改值以匹配您的代码 2.修改build.gradle(项目) 上面写着这样的话:如何将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:
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,如数组和字符串
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