Android Studio 生成so库 第一篇
Android Studio 生成so库 第二篇
根据前两篇,大概了解了android studio中生成so库的步骤和方式,那么下面生成so库,供其他工程调用,具体的怎么生成cpp文件,这里就不再阐述了,接着写cpp文件。
demo.cpp
#include <jni.h>
/* Header for class com_test_testjni_JniTest 生成so库的依赖类文件 */
#define JNIREG_CLASS "com/test/testjni/JniTest"
/* 将通过java函数映射的C函数 */
jstring getStringCpp(JNIEnv *env, jobject obj, jstring str);
static JNINativeMethod gMethods[] = {
{ "getStringFromNative", "(Ljava/lang/String;)Ljava/lang/String;", (void*)getStringCpp},
};
/* 注册C函数 */
static int registerNativeMethods(JNIEnv* env, const char* className,
JNINativeMethod* gMethods, int numMethods)
{
jclass clazz;
clazz = (env)->FindClass(className);
if (clazz == NULL) {
return JNI_FALSE;
}
if ((env)->RegisterNatives(clazz, gMethods, numMethods) < 0) {
return JNI_FALSE;
}
return JNI_TRUE;
}
/* 注册C函数 */
static int registerNatives(JNIEnv* env)
{
if (!registerNativeMethods(env, JNIREG_CLASS, gMethods,
sizeof(gMethods) / sizeof(gMethods[0])))
return JNI_FALSE;
return JNI_TRUE;
}
/* cpp文件加载 */
jint JNI_OnLoad(JavaVM* vm,void* reserved){
//anti_debug();
JNIEnv* env;
if ((vm)->GetEnv((void**)(&env), JNI_VERSION_1_6) != JNI_OK)
{
return -1;
}
if (!registerNatives(env)) {//注册
return -1;
}
return JNI_VERSION_1_6;
}
__attribute__((section (".mytext")))
JNICALL jstring getStringCpp
(JNIEnv *env, jobject obj, jstring str) {
const char *strAry = (env)->GetStringUTFChars(str, 0);
return (env)->NewStringUTF(strAry);
}
clean project 之后 rebuild project 找到生成的so库,然后放到我们需要添加的工程中
新工程,将so库放到libs下,工程下创建com/test/testjni/JniTest.java的类文件
JniTest.java 加载so库
public class JniTest {
// 加载native-jni
static {
System.loadLibrary("demoCPP");
}
public static native String getStringFromNative(String str);
}
MainActivity中的调用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView=findViewById(R.id.txtView);
textView.setText(JniTest.getStringFromNative("太神奇了!!~~66666666"));
}
}
网友评论